118杨辉三角
这题很简单,应该算是刚学c语言二维数组就必打的题目
也没什么好说的,这里需要学习的就是vector二维数组的写法了
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> nums(numRows); //层数
for(int i = 1; i <= numRows; i++){
nums[i - 1].resize(i); //每层的空间
}
for(int i = 0; i < numRows; i++){
for(int j = 0; j < i + 1; j++){
if(j == 0 || j == i) nums[i][j] = 1;
else nums[i][j] = nums[i - 1][j - 1] + nums[i - 1][j];
}
}
return nums;
}
};
vector<vector> nums(numRows); //层数
for(int i = 1; i <= numRows; i++){
nums[i - 1].resize(i); //每层的空间
}
看了题解之后改进了代码的写法
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> nums(numRows); //层数
for(int i = 0; i < numRows; i++){
nums[i].resize(i + 1); //每层的空间
nums[i][0] = 1;
nums[i][i] = 1;
for(int j = 1; j < i; j++){
nums[i][j] = nums[i - 1][j - 1] + nums[i - 1][j];
}
}
return nums;
}
};
只要遍历一次
119杨辉三角2
这次多了一个指定的索引行,因此可以节省空间,很容易想到滚动数组,用另外一个数组记录当前数组的上一行
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> pre,cur;
for(int i = 0; i <= rowIndex; i++){
cur.resize(i + 1);
cur[0] = cur[i] = 1;
for(int j = 1; j < i; j++){
cur[j] = pre[j] + pre[j - 1];
}
pre = cur;
}
return cur;
}
};
其实自己原本想的就是在原数组上进行操作,但是由于第 j 个的值和第 j 、j - 1有关,而前面一个已经被更新了,一直在想怎么把之前那个没更新的先存储起来,怎么样都没有想好,才放弃了这个想法,但是!!!!看了题解之后!!!!!发现原来可以倒着计算!!!!倒着计算就不会影响j 、j - 1的值了!!!!因为每次更新的是j + 1的数组。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> cur;
cur.push_back(1);
for(int i = 1; i <= rowIndex; i++){
cur.resize(i + 1);
for(int j = i; j > 0; j--){
cur[j] = cur[j] + cur[j - 1];
}
}
return cur;
}
};
上面那个执行用时真的很迷,但是这个倒着计算的想法真的太强了!