杨辉三角这道题有许多解法,譬如可以利用二维数组、集合…去解。今天我就使用集合的方式解这道题。
那么可以得到一个公式: [ i ][ j ] = [ i - 1 ][ j ] + [ i - 1 ][ j - 1 ];
这个公式意思是:
[ i ][ j ] :杨辉三角里的每一个数
[ i - 1 ][ j ]:这个数的上一行的这一列的数
[ i - 1 ][ j - 1 ]:这个数的上一行的上一列的数
因为,这个数的左上方的数**=**这个数的上一行的上一列的数,右上方的数 **=**这个数的上一行的这一列的数。
可能冗长的文字无法直接了当的使我们快速的理解,我们画图说明。
每一行是i,每一列是j,由图上可以清晰地看出,每一个数字都是由其上一行的上一列**+**上一行的这一列。
图上的list 是一个存放了 集合类型的集合(集合嵌套) ,用代码表示就是:List list = new ArrayList<>(); list中存放着numRows个集合。首先通过代码:List list1 = new ArrayList<>();先将数据准备好,list1 就是集合1,list1.add(1); 集合1存放着杨辉三角的第一个数据1。再将list1添加到集合list中,list.add(list1);
 {
List curList = new ArrayList<>();
curList.add(1);
}
接下来就需要确定每个集合中的元素个数。通过观察杨辉三角我们发现:
每个list中的集合元素list1、list2、list3、list4、list5,他们的最后一个元素下标与集合list的集合元素下标相同,表明i 和 j 最多相遇。
代码如下:
class Solution {
public List generate(int numRows) {
List list = new ArrayList<>();//存放集合的集合
List list1 = new ArrayList<>();//先创建一个集合list1
list1.add(1);//,将数据1加入集合list1
list.add(list1);//再将list1加入list
for (int i = 1; i < numRows; i++) {//从集合的1下标开始遍历,因为list的0下标已经有元素list1了
List curList = new ArrayList<>();
curList.add(1);
List prevR = list.get(i-1);//获取集合list的上一行
for (int j = 1; j < i; j++) {
int num = prevR.get(j) + prevR.get(j-1);//获取集合list的上一行的第j列元素以及集合list的上一行的第j - 1列元素之和
curList.add(num);
}
curList.add(1);
ret.add(curList);
}
return list;
}
}