119. Pascal’s Triangle II
Given an integer rowIndex, return the rowIndexth (0-indexed) row of the Pascal’s triangle.
In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown:
Example 1:
Input: rowIndex = 3
Output: [1,3,3,1]
Example 2:
Input: rowIndex = 0
Output: [1]
Example 3:
Input: rowIndex = 1
Output: [1,1]
Constraints:
0 <= rowIndex <= 33
Follow up: Could you optimize your algorithm to use only O(rowIndex) extra space?
solution1 递推
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<vector<int>> C(rowIndex + 1);
for (int i = 0; i <= rowIndex; ++i) {
C[i].resize(i + 1);
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; ++j) {
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
}
}
return C[rowIndex];
}
};
优化-滚动数组
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 - 1] + pre[j];
}
pre = cur;
}
return pre;
}
};
优化-一个数组
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> row(rowIndex + 1);
row[0] = 1;
for (int i = 1; i <= rowIndex; ++i) {
for (int j = i; j > 0; --j) {
row[j] += row[j - 1];
}
}
return row;
}
};
solution2 线性递推
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> row(rowIndex + 1);
row[0] = 1;
for (int i = 1; i <= rowIndex; ++i) {
row[i] = 1LL * row[i - 1] * (rowIndex - i + 1) / i;
}
return row;
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/pascals-triangle-ii/solution/yang-hui-san-jiao-ii-by-leetcode-solutio-shuk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
动态规划(DP) + 滚动数组
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> dp(rowIndex+1, 1); // 第rowIndex行有rowIndex个数
for(int i=1;i<=rowIndex;i++) // 更新rowIndex次dp
for(int j=i-1;j>=1;j--) // 从后向前更新dp[1,2,...,i-1],保证已更新的数不影响未更新的数
dp[j] += dp[j-1]; // 当前位置数=上一轮当前位置数+上一轮前一位置数
return dp;
}
};
组合数学 + 递推公式
Cmn = n!/[m!(n-m)!] = (n-m+1)/m * C(m-1)n
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> dp(rowIndex+1, 1); // 第rowIndex行有rowIndex个数
for(int i=1;i<=rowIndex;i++) // 更新rowIndex次dp
dp[i] = dp[i-1] * 1LL * (rowIndex-i+1) / i; // 防治溢出使用LL
return dp;
}
};
作者:nbgao
链接:https://leetcode.cn/problems/pascals-triangle-ii/solution/119-yang-hui-san-jiao-ii-by-nbgao-sfk0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。