2017-01-27,年三十儿,LeetCode刷的首个题, 难是不难,就是犄角旮旯的坑要注意。
下面贴出的是run code通过检测的并submit的版本。
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vals;
vals.resize(numRows);
for(int i=0;i<numRows;i++)
{
vals[i].resize(i+1);
vals[i][0]=1;
vals[i][vals[i].size()-1]=1;
for(int j=1;j<vals[i].size()-1;j++)
{
vals[i][j]=vals[i-1][j-1]+vals[i-1][j];
}
}
return vals;
}
};
Pascal‘s Triangle的第二个版本是将Triangle的第几行返回,这个题里牵扯到一个计算顺序的问题,就是如果按照vals[i][j]=vals[i-1][j-1]+vals[i-1][j]的计算顺序来的话,并且,要注意,就是这个题是的全文是
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?
重点是这个Note,只能用O(k)个的空间,也就是说只能用一行来显示,那就是说,只有一个数组,一旦正向计算,比如:vals[i][j]=vals[i-1][j-1]+vals[i-1][j],就会造成计算出的值覆盖待计算的值,所以,这里的计算要反向来,就是:vals[j]=vals[j-1]+vals[j]。举个栗子:
vals[4][2]=vals[3][1]+vals[3][2],得到的答案是4,因为数组只有一个,所以存储的时候4会覆盖2这个位置,进而影响vals[4][3]位置的计算。
但是实现反向计算的时候就是如下状况:vals[4][3]=vals[3][2]+vals[3][3],得到6以后,6会覆盖3这个位置,但不会影响计算vals[4][2]的计算。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> vals;
vals.resize(rowIndex+1,1);
for(int i=0;i<rowIndex+1;++i)
{
for(int j=i-1;j>=1;--j)
{
vals[j]=vals[j-1]+vals[j];
}
}
return vals;
}
};