LeetCode118. Pascal's Triangle 杨辉三角
题目
给定行数,生成对应的杨辉三角
思考
- 同一行是对称的,最大的下标为(行数+1)/2;1,1,2,3,6;下标从0开始,则对应分别为0.0.1.1.2.2
- 对于第偶数行,个数也是偶数,对于奇数行,个数也是奇数
- 而且对于非第一列的数,d[i][j]=d[i-1][j-1]+d[i-1][j]
后面通过编程实现,发现自己第一个条件是完全没有用的,可以不需要用到对称性,直接由上一行计算下一行(即第三条)。
而且忘记说最后一列了。
所以新的思考点是:
- 对于非第一列/最后一列的数,d[i][j]=d[i-1][j-1]+d[i-1][j]
- 第一列和最后一列初始化为1即可
出现过的错误
粗心
由于粗心把当前行数i
用总行数numRows
代替,所以出现了下标出界的情况Line 18: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
。
没想清楚
还有没想清楚关于对称点和i、j的关系,所以总是出界。最后考虑取消这个点,从总体情况考虑。
局部变量带来的问题
把lineInts
声明在函数域中,结果放入总的嵌套List中出了问题。然后在for的局部域中声明这个变量,问题就解决了。
代码
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> results=new ArrayList<List<Integer>>(numRows);
for(int i=0;i<numRows;i++){//i代表当前行数-1
ArrayList<Integer> lineInts=new ArrayList<Integer>();//这一行的数字
lineInts.add(1);//每行第一个是1
int j=1;
for(;j<i;j++){
int sum=results.get(i-1).get(j-1)+results.get(i-1).get(j);
lineInts.add(sum);
}
if(i>0)
lineInts.add(1);//最后加一个1
results.add(lineInts);
}
return results;
}
总结
成绩是32%,应该还有优化的地方,回头再考虑一下吧。