【c/c++】leetcode 118 & 119 Pascal‘s triangle I & II
阿新 • • 發佈:2018-12-12
1 普通思路
根據定義,用一個vector存前一行的資料,後一行根據前一行計算 存一個二維vec 並返回
//118 class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector<int>> vec; for(int i = 0;i < numRows;i++){ vector<int> vector1; vector1.push_back(1); for(int j = 1;j < i ; j++){ vector1.push_back(vec[i-1][j-1] + vec[i-1][j]); } if(i != 0) vector1.push_back(1); vec.push_back(vector1); } return vec; } };
119:按要求返回rowIndex行, 注意這裡的行從0開始計
//119 class Solution { public: vector<int> getRow(int rowIndex) { vector<vector<int>> vec; for(int i = 0;i < rowIndex+1;i++){ vector<int> vector1; vector1.push_back(1); for(int j = 1; j < i ; j++){ vector1.push_back(vec[i-1][j-1] + vec[i-1][j]); } if(i != 0) vector1.push_back(1); vec.push_back(vector1); } return vec[rowIndex]; } };
2 優化空間複雜度O(k)
用119為例,118同理
rowIndex= 4的時候,由第三行1 3 3 1 如何求1 4 6 4 1
1 3 3 1
+ 1 3 3 1
————————
= 1 4 6 4 1
so 解法:將前一行resize(i+1 ,1),即在末尾加一個位 並賦值為1,1 3 3 1 -》 1 3 3 1 x 賦值1-》 1 3 3 1 1
從倒數第二個往前遍歷
class Solution { public: vector<int> getRow(int rowIndex) { vector<int> vec = {1}; if(rowIndex == 0) return vec; for(int i = 1;i < rowIndex+1;i++){ vec.resize(i+1,1); for(int j = i - 1 ;j >=1 ;j--){ vec[j] = vec[j] + vec[j - 1]; } } return vec; } };