这道题目是有关三角形的题目,因此可能会涉及到二维数组的问题,在处理这样的三角形问题的时候,有一个比较好的方法就是将三角形当作半个矩阵来看,这样可以比较方便地理清元素下标之间的关系。比如题目中给出的例子是这样:
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]我们可以将它这样来对待:
[1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]这样就可以看出元素下标之间的关系:对于中间部分的某个元素a[i][j] = a[i][j - 1] + a[i - 1][j - 1];而前两行,对角线和第一列的元素均为1。一开始我也是按照这种方式来做的,但是这样就分了比较多的情况,处理起来很麻烦,有一个更简单的判断方式就是当i == 0 || j == 0 || j == i的时候,元素为1,这样就可以将所有的内容统一的一个循环里进行计算。另外还有一个需要注意的地方,在我们找规律的时候,元素的坐标是[列][行],而在我们存储元素的ArrayList<List<Integer>>中,第一次get得到的是行,第二次get得到的是列,也就是说我们在其中找元素的时候按照[行][列]的方式,这一点要仔细考虑到。代码如下:
public class Solution{
public List<List<Integer>> generate(int numRows){
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
// Corner case
if(numRows < 1) return triangle;
for(int i = 0; i < numRows; i++){
List<Integer> level = new ArrayList<Integer>();
for(int j = 0; j <= i; j++){
if(i == 0 || j == 0 || i == j){
level.add(1);
}else{
level.add(triangle.get(i - 1).get(j - 1) + triangle.get(i - 1).get(j));
}
}
triangle.add(level);
}
return triangle;
}
}
知识点
1. List<List<Integer>>的实例化方式是ArrayList<List<Interger>>()或者是ArrayList<>();而不是ArrayList<ArrayList<Integer>>()
2. 如果使用ArrayList<List<Interger>>()存储二维的数组,那么访问元素的方式是get(行).get(列)