leetcode之pascals-triangle-ii(杨辉三角)
题目
Given an index k, return the k th 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?
题意
给定一个index k,要求返回第k行的杨辉三角对应的行的数组。
例如index=3,则返回数组[1,3,3,1]。
解题思路
杨辉三角的显著特征就是下一层index为i的值对应是上一层的index为i和i-1的值之和;
所以有dp2[i] =dp1[i]+dp1[i-1];
但是这里其实dp2是dp1的下一层,这里有一个简单的存储算法:
其实dp2的对应的数组长度 = dp1+1。这里可以采用典型的滚动计算法,先计算上一层,然后到一下层时,
直接还是使用原来的dp数组进行存储,对应的值直接改变为dp[i] = dp[i]+dp[i-1] ,既可,因为这里等式的左边代表新一层的dp数组,而等式的右边代表上一层已经计算好的数组。
C++实现代码
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> dp(rowIndex+1,1);
dp[0]=1;
for(int i=2;i<rowIndex+1;i++){ //从第二行开始求
for(int j=i-1;j>0;j--){
dp[j] = dp[j]+dp[j-1]; //这里是滚动计算,每一次int i的递增,都是代表着对应层的dp被计算出来,然后又到下一层,再次被dp[i]=dp[i+dp[i-1]给刷新,变成下一层的杨辉三角的那一层的数组
}
}
return dp;
}
};