题目要求是only O(k) 额外空间。我们考虑每个结果都只是与其前一个结果相关,因此我们考虑只多开辟一个空间pre用于保存前一次的结果。
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> curr = new LinkedList<>(), prev = new LinkedList<>();
prev.add(1);
if(rowIndex == 0) return prev;
prev.add(1);
if(rowIndex == 1) return prev;
for(int i=2; i <= rowIndex; i++){
//curr = new LinkedList<>();
curr.add(1);
for(int j=0; j+1 < prev.size(); j++)
curr.add(prev.get(j)+prev.get(j+1));
curr.add(1);
prev = curr;
}
return curr;
}
}
上述做法导致了空间超过限制条件。因为红色部分也开辟了一个固有空间,每次都会在该空间上增加数字。
正确做法如下:
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> curr = null, prev = new LinkedList<>();
prev.add(1);
if(rowIndex == 0) return prev;
prev.add(1);
if(rowIndex == 1) return prev;
for(int i=2; i <= rowIndex; i++){
curr = new LinkedList<>();
curr.add(1);
for(int j=0; j+1 < prev.size(); j++)
curr.add(prev.get(j)+prev.get(j+1));
curr.add(1);
prev = curr;
}
return curr;
}
}
上述做法使得每次进入循环时会动态开辟一块新空间,相当于这个list是全新的,刚开始没有数据的。