1. 程式人生 > >【c/c++】leetcode 118 & 119 Pascal‘s triangle I & II

【c/c++】leetcode 118 & 119 Pascal‘s triangle I & II

 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;
    }
};