题目描述
Given an index k, return the k th 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?
s我的做法是把前一个题的某一行数据拿出来用:
import java.util.ArrayList;
public class Solution {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
public ArrayList<Integer> getRow(int rowIndex) {
return generate(rowIndex+1).get(rowIndex);
}
public ArrayList<ArrayList<Integer>> generate(int numRows) {
if(numRows<=0)return list;
else if(numRows==1) {
ArrayList<Integer> a = new ArrayList<Integer>();
a.add(1);
list.add(a);
return list;
}
else if(numRows==2) {
ArrayList<Integer> a = new ArrayList<Integer>();
ArrayList<Integer> b = new ArrayList<Integer>();
a.add(1);
list.add(a);
b.add(1);
b.add(1);
list.add(b);
return list;
}
else {
ArrayList<Integer> a = new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> generate = generate(numRows-1);
ArrayList<Integer> prev = generate.get(generate.size()-1);
//prev[i-1]+prev[i]=curr[i];numRows-1>i>0
a.add(1);
for (int i = 1; i < numRows-1; i++) {
a.add(prev.get(i-1)+prev.get(i));
}
a.add(1);
list.add(a);
}
return list;
}
}
S但是还有一种我不会的解法,就使用用后一行的值覆盖前一行的值,如何覆盖,后一行的bi=ai-1+ai;就这样覆盖,并且用for循环的判断条件排除0,在覆盖后最后又添加一个值1,这个1是为了给覆盖的,当最后的row-1个值被覆盖,又添加的这个1就是row的值。真的是非常精辟啊,非常节省空间。以及利用for循环的条件判断非常熟练,我认为如果碰到要求减少空间复杂度的题就会用到这种方法,就是反复利用一个数组(或其他储存空间),这种必然可以用递归解决,同时也是上一步和当前步有关联,真是非常值得学习的解法啊,这种方法学到手会对自己的码代码的思维和利用空间的方法有更加明显的增长。
public ArrayList<Integer> getRow(int rowIndex) {
ArrayList<Integer> row = new ArrayList<>();
if (rowIndex < 0)
return row;
for (int i = 0; i < rowIndex + 1; i++) {
for (int j = i - 1; j > 0; j--) {
row.set(j, row.get(j) + row.get(j - 1));
}
row.add(1);
}
return row;
}