前言
今天给你们分享一件非常令人开心的事情,我在学校有了一个妹妹,傻乎乎的,还爱哭,整天不洗头,脏兮兮的,但是她人单纯随和,天真可爱,她总能给我一种安心的感觉,这一定是我这半年来最开心的事情了。话不多说,今天要分享的题目是杨辉三角,真是一道经典且酣畅淋漓的编程题呢。由于太过经典,可参考以下网址--------点击我。
题目

解法
class Solution {
public:
vector<int> getRow(int rowIndex) {
int f[34][34];
for(int i=0;i<=rowIndex;i++){
for(int j=0;j<=i;j++){
if(j==0||j==i){
f[i][j] = 1;
}else{
f[i][j] = f[i-1][j-1]+f[i-1][j];
}
}
}
vector<int>ret;
for(int i=0;i<=rowIndex;i++){
ret.push_back(f[rowIndex][i]);
}
return ret;
}
};
这种方法就是新建一个数组来缓存杨辉三角,然后再创建一个顺序表,再返回对应某一行的数据。
这个同理:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<vector<int>>ret(rowIndex+1);
for(int i=0;i<=rowIndex;i++){
ret[i].resize(i + 1);
for(int j=0;j<=i;j++){
if(j==0||j==i){
ret[i][j] = 1;
}else{
ret[i][j] = ret[i-1][j-1]+ret[i-1][j];
}
}
}
return ret[rowIndex];
}
};
进阶解法
class Solution {
public:
vector<int> getRow(int rowIndex) {//滚动数组
vector<int>pre;
vector<int>now;
for(int i=0;i<=rowIndex;i++){
now.resize(i+1);
now[0] = now[i] = 1;
for(int j=1;j<i;j++){//j从1开始,因为0位置已赋值为1
now[j] = pre[j] + pre[j-1];
}
pre = now;
}
return pre;
}
};
这个是用滚动数组来做的,相当于借助了一点前缀和的东西,利用存储前一行数组的值来求后一行数组的值,使原本的二维数组变成了一维数组,大大优化了空间复杂度。
反思
1.考察知识点:杨辉三角:

2.踩的坑:这个题目一开始我就没有做出来,我一开始一直在寻找数字与数字之间的规律,然后利用规律解题,但实际上凭借一些简单的循环和最基本的关系也可以构建出来,就是俗称的暴力嘛,这个也未尝不可,所以只要题目要求并不苛刻,暴力也未尝不可。
3.可以优化的地方:今天利用滚动数组来优化,明天将进一步利用数学规律或者线性递归进行优化,敬请期待:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int>ret;
ret.resize(rowIndex+1);//rowIndex+1而不是rowIndex
ret[0] = 1;
for(int i=1;i<=rowIndex;i++){
for(int j=i;j>0;j--){//j>0而不是j>=0
ret[j]+=ret[j-1];
}
}
return ret;
}
};
这个我现在依然无法理解,所以后面的线性递归也不展示了,以后学完了回来看看。

被折叠的 条评论
为什么被折叠?



