题目
Example:
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
我的尝试
我的代码因为leetcode缺少list接口的addAll方法,无法测试通过,我的思路是利用动态规划,存储前一行数据,然后遍历,相加得到下一行数据,没有测试,无法验证逻辑
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
List<Integer> firstRowList=new LinkedList();
firstRowList.add(1);
firstRowList.add(1);
triangle.addAll(firstRowList);
int row=2;
List<Integer> latestList=new LinkedList();
latestList=list;
while(row<numRows){
List<Integer> nextList=new LinkedList();
nextList.add(1);
for(int i=0;i<latestList.size()-1;i++){
nextList.add(latestList.get(i)+latestList.get(i+1));
if(i==latestList.size()-1){
nextList.add(1);
}
}
list.addAll(nextList);
latestList=nextList;
}
return list;
}
}
正确解法
我的痛点是什么?不知道怎么取出上一行的元素,忽略了,上一行的元素已经存储在全部的list中了。应该从全局list中拿出上一行,然后进行相加,求出当前行的元素。看了代码思路,我尝试写了一下,注意第二行虽然看起来比较特殊,其实一样的逻辑可以处理,因为size不满足,for循环没有添加元素,只是添加了头尾的两个1.
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
if(numRows==0) return triangle;
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for(int i=1;i<numRows;i++){
List<Integer> currList=new LinkedList();
List<Integer> preRowList=triangle.get(i-1);
currList.add(1);
for(int j=0;j<preRowList.size()-1;j++){
currList.add(preRowList.get(j)+preRowList.get(j+1));
}
currList.add(1);
triangle.add(currList);
}
return triangle;
}
}