以定义一个二维整形数组并初始化为例:
// 初始化一个 二维的matrix, 行M,列N,且值为0
vector<vector<int>> matrix(M,vector<int>(N));
//等价于下面的
vector<vector<int> > matrix(M);
for(int i=0;i<M;i++) {
matrix[i].resize(N);
}
//等价于下面的
vector< vector<int> > matrix;
matrix.resize(M);//M行
for(int i=0;i<matrix.size();i++){
matrix[i].resize(N);//每一行都是N列
}
// 初始化一个 二维的matrix, 行M,列N,且值自定义为data;
vector<vector<int>> matrix(M,vector<int>(N,data));
//初始化空的二维vector,到底是{}还是{{}},请看最下面的两个leetcode例题
vector<vector<int>> matrix1{};
或者
vector<vector<int>> matrix1{{}};
//初始化列表
vector<vector<int>> matrix2{ {1},{1,1} };//学会用大括号初始化二维数组
matrix1.push_back({ 1,2,1 });//插入
vector<vector<int>>matrix(M);//M行,列数不固定
int col;
vector<int> temp;
for(int i=0;i<M;i++){
cout<<”please input the col of ”<<i<<” row”<<endl;
cin>>col;//确定第i行的列数
cout<<i<<” row has ”<<col<<” col”<<” please input these”<<endl;
for(int j=0;j<col;j++{
int data;
cin>>data;
temp.push_back(data);
}
matrix[i]=temp;
temp.clear();
}
#include
#include
using namespace std;
int main()
{
vector<vector<int>> matrix;//行,列数不固定
cout << "please input rows of matrix: " << endl;
int rows;
cin >> rows;
matrix.resize(rows);
int col;
vector<int> temp;
for (int i = 0; i < rows; i++) {
cout << "please input the cols of " << i << "th row" << endl;
cin >> col;//确定第i行的列数
cout << i << "th row has " << col << " cols," << "please input these" << endl;
for (int j = 0; j < col; j++){
int data;
cin >> data;
temp.push_back(data);
}
matrix[i] = temp;
temp.clear();
}
cout << "output matrix:" << endl;
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
cout << endl;
return 0;
}
118.杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
class Solution {
public:
vector<vector<int>> generate(int numRows) {
//学会用大括号初始化二维数组
if(numRows==0) return{};
if(numRows==1) return{{1}};
if(numRows==2) return{{1},{1,1}};
vector<vector<int>> ans(numRows);
ans[0]={1};
ans[1]={{1},{1}};
vector<int> temp;
for(int i=3;i<=numRows;i++){
temp.push_back(1);
for(int j=0;j<i-2;j++){
temp.push_back(ans[i-2][j]+ans[i-2][j+1]);
}
temp.push_back(1);
ans[i-1]=temp;
temp.clear();
}
return ans;
}
};
前面一题返回空的二维vector时,返回的是{}
但是今天遇到一个题,在返回空的二维vector时,必须返回{{}}
题目记录如下:
面试题 08.04. 幂集
幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。
说明:解集不能包含重复的子集。
示例:
解题思路:
1.递归,
2.回溯
这里只讲递归的解法:
subsets([1,2,3])={[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]}
subsets([1,2])={[],[1],[2],[1,2]}
可以发现
subsets([1,2,3])=subsets([1,2]) + subsets([1,2])中的每一个子集中插入3
vector<vector<int>> subsets(vector<int>& nums) {
int N=nums.size();
//注意这里必须返回{{}},不能是{}
if(N==0) return{{}};
int tail=nums.back();
nums.pop_back();
//递归
vector<vector<int>> sub=subsets(nums);
//注意nums是引用,所以在底层递归向上层递归返回时,要恢复删除的尾部元素
nums.push_back(tail);
vector<vector<int>> res(sub);
for(auto& i:sub){
i.push_back(tail);
res.push_back(i);
}
return res;
}
这里只想关注一个点,针对这一题,当nums.size()==0时,我们返回空的二维vector,必须是 {{}}
由上面两个例题可以看出,对于空的二维vector,可能是用{}初始化,也可能是用{{}}初始化,具体用哪一种,得看一下题目在返回空的二维vector时,要求返回的是啥,