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