LeetCode | 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?

按昨天的思路,不考慮空間複雜度的優化:

//當index=3時,numRows=4
//額外使用了3個list,題目建議只用一個,運行可以accept
public class Solution {
    public List<Integer> getRow(int rowIndex) {
        
        List<Integer> result = new ArrayList<Integer>();
        List<Integer> preRow = new ArrayList<Integer>();  
        preRow.add(0);
        
        for(int i=1; i<=rowIndex+1; i++){
            List<Integer> curRow = new ArrayList<Integer>();  
            for(int j=0; j<i; j++){
                if(j < 1){
                    curRow.add(1);
                }else if(j >= preRow.size()){
                    curRow.add(1);
                }else{
                    curRow.add(preRow.get(j-1) + preRow.get(j));
                }
            }
            preRow = curRow; 
            result = curRow;
        }
        return result;
    }
}

優化空間複雜度,只適用一個list:

//優化空間複雜度:直接在preRow的list上覆寫生成curRow,來節省空間
//思路:row.set(index, Integer) => row.set(j, row.get(j-1)+row.get(j))
//但是這樣的正向遍歷是有問題的,本次row.set(j, row[j-1] + row[j]),則下次計算時
//row.set(j+1, row[j] + row[j+1]),雖然row[j+1]還是preRow中的值,但是row[j]已經被覆寫了,
//而不是preRow的值了,再相加時就不符合楊輝三角了。因而要反向遍歷,避免數據污染
public class Solution {
    public List<Integer> getRow(int rowIndex) {
        
        List<Integer> row = new ArrayList<Integer>();
        row.add(1);
                                            //rowIndex<=0時,跳過循環到return,因而不需額外判斷
        for(int i=1; i<=rowIndex; i++){     //i表示index,第1行的index爲0
            
            for(int j=row.size()-1; j>0; j--){         //反向遍歷填充第i行的[1~~length-1]
                row.set(j, row.get(j-1)+row.get(j));   //row[0]恆爲1,不能覆蓋
            }
            row.add(1);                                //在末尾add一個1,構成新row
        }
        
        return row;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章