/**
- 杨辉三角
- 思路:
- 把每一行都看作一个list或者二维数组,然后再把每一行的list或者二维数组都放到一个大的list里面
- 其实思路一样的,但是我觉得用二维数组更直观,我都写下来,对比着看吧
*/
public class Practice118 {
public static void main(String[] args) {
Practice118 p = new Practice118();
int numRows = 5;
//方法1
List<List> lists = p.generate(numRows);
System.out.println(lists);
//方法2
List<List> arrayLists = p.generateByarray(numRows);
System.out.println(arrayLists);
}
//方法1
private List<List> generate(int numRows) {
List<List> tarList = new ArrayList<>();
//这一个for控制循环次数,也就是杨辉三角有几行,注意i要<=,跟平时的<不一样
for (int i = 0; i <= numRows; i++){
//在这里面每次循环生成一个新的链表用于存储每一行的数字
List tempLists = new ArrayList<>();
//这个for循环用于生成每一行
for (int j = 0; j <= i; j++){
//如果是第一个和最后一个就赋值1
if (j == 0 || j == i){
tempLists.add(1);
}else {
//从第三行开始,第二个都等于前面一行的前一个位置和这一个位置
// 比如:第3行第2个 = 第2行第1个+第2个
tempLists.add(tarList.get(i - 1).get(j) + tarList.get(i - 1).get(j - 1));
}
}
//每一行循环结束就把链表添加到大的链表中
tarList.add(tempLists);
}
return tarList;
}
//方法2,其实思路一样的,不过好理解一点
private List<List> generateByarray(int numRows) {
List<List> tarLists = new ArrayList<>();
int[][] array = new int[numRows][numRows];
for (int i = 0; i<= numRows; i++){
List tempLists = new ArrayList<>();
for(int j = 0; j <= i; j++){
if (j == 0 || j == i){
array[i][j] = 1;
}else {
tempLists.add(array[i - 1][j] + array[i - 1][j - 1]);
}
}
tarLists.add(tempLists);
}
return tarLists;
}
}
//动态规划我还没看,所以我也不大理解,反正我晓得可以这么写,然后今天上课就没时间刷了,晚安各位
原文链接:https://leetcode-cn.com/problems/pascals-triangle/