Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return [1,3,3,1]
.
Note:
Could you optimize your algorithm to use only O(k) extra space?
Subscribe to see which companies asked this question.
惯例翻译题目:给出帕斯卡三角第n行的行数,然后输出这一行,要求只能使用O(k)的空间;
思路:
这里需要注意,它的行数是从0开始,所以给出的行数如果是numRows,其实是第numRows+1行;
第一第二行做判定,输入为0或者1则直接赋值然后输出;
如果numRows大于或者等于2,则逐行计算;这就是外层循环了;从第三行开始,对应numRows=2;
到numRows行;
内层循环则是从第二个元素开始,坐标为i元素等于之前的vals[i-1]+vals[i],然后将这个数存储在一个临时变量tmp里面;
一开始也有一个临时变量temp初始化为0;然后把temp赋值给vals[i-1],这个时候可以改变是因为下一个元素的生成已经用不到它了;
然后再把tmp的值赋值给temp;
最后做一个判断当时的元素是不是每一行的倒数第二个元素,如果是,说明已经不用再继续计算下去,直接将计算得到的tmp的值赋值给对应的位置;
最后末尾添加一个元素,赋值为1;
以下为代码:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> vals;
vals.resize(rowIndex+1);
int i,j,k,temp,tmp;
if(rowIndex<2){
if(rowIndex==0){
vals[0]=1;
return vals;
}
else{
vals[0]=1;
vals[1]=1;
return vals;
}
}
else{
vals[0]=1;
vals[1]=1;
for(j=2;j<=rowIndex;j++){
temp=vals[0];
for(i=1;i<j;i++){
tmp=vals[i-1]+vals[i];
vals[i-1]=temp;
temp=tmp;
if(i==j-1){
vals[i]=temp;
vals[j]=1;
}
}
}
return vals;
}
}
};
期间发生的错误:
注:这道题不存在空的情况;
1.编码习惯问题,一开始先写了内层循环,添加外层循环后大括号少了一个;
2.用到vector的时候需要为其分配空间,分配错误会出错,不分配也会出错;
错误为下面这个:
室友说其实算一半就行,后面的跟前面的一样,这个倒是省力气;
补充:看了下别人的,O(k)的限制在于不能用二维数组,只能用一维数组滚动运算;