118. Pascal's Triangle
Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
杨辉三角,托腮。时间复杂度O(n^2),空间复杂度O(n)
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int> > ans;
if (!numRows) return ans;
vector<int> pre(1, 1);
ans.push_back(pre);
if (numRows == 1) return ans;
int cnt = 2;
while (cnt <= numRows) {
vector<int> cur(cnt, 1);
if (cnt == 2) {
ans.push_back(cur);
pre = cur;
cnt++;
continue;
}
for (int i = 1; i < cnt - 1; ++i) {
cur[i] = pre[i-1] + pre[i];
}
ans.push_back(cur);
pre = cur;
cnt++;
}
return ans;
}
};
评论区总有写的更好的,无额外空间复杂度
class Solution {
public:
vector<vector<int> > generate(int numRows) {
vector<vector<int>> r(numRows);
for (int i = 0; i < numRows; i++) {
r[i].resize(i + 1);
r[i][0] = r[i][i] = 1;
for (int j = 1; j < i; j++)
r[i][j] = r[i - 1][j - 1] + r[i - 1][j];
}
return r;
}
};
119. Pascal's Triangle II
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?
存一行更新下一行,时间复杂度O(n^2),空间复杂度O(k)
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> pre(1, 1);
if (!rowIndex) return pre;
int cnt = 2;
while (cnt <= rowIndex + 1) {
vector<int> cur(cnt, 1);
if (cnt == 2) {
pre = cur;
cnt++;
continue;
}
for (int i = 1; i < cnt - 1; ++i) {
cur[i] = pre[i-1] + pre[i];
}
pre = cur;
cnt++;
}
return pre;
}
};
唔,发现个不使用额外空间的
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> A(rowIndex+1, 0);
A[0] = 1;
for(int i=1; i<rowIndex+1; i++)
for(int j=i; j>=1; j--)
A[j] += A[j-1];
return A;
}
};