目录

PascalTriangle

目录
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package efl.ryl.easy;

import java.util.ArrayList;
import java.util.List;

/**
 * Author: Azad-eng
 * Date: 2022/3/3
 * Description: 杨辉三角
 */
public class Pascal_Triangle {
//              [1]
//             [1,1]
//            [1,2,1]
//           [1,3,3,1]
//          [1,4,6,4,1]
//         [............]
    
    public List<List<Integer>> generate(int numRows) {
        //二维列表的运用——杨辉三角
        /**
         * 思路分析:
         * 1.主集合List<List<Integer>> ret有且仅有一个,但子集合List<Integer> row 有numRows个(numRows=ret.size()),因此要new创建ret.size()个row
         * -所以 for (int i = 0; i < numRows; ++i) {}
         * 2.row集合中元素的add规律:第1行,add 1次,第2行,add 2次...第numRows行,add numRows次
         * -所以 for (int j = 0; j <= i; ++j){}
         * 3.add的值也有规律:
         * -3.1 每一行头尾(第一个行头尾重合)的值都是1:row.get(0)=1,row.get(i)=1
         * -所以if (j == 0 || j == i) {row.add(1);}
         * -3.2 非头尾的值 =上一行的相同位置的前一个元素的值 +上一行的相同位置的元素的值
         * -所以 row.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j))
         */
        //List是接口,不能实例化,因此List<List<Integer>> list = new List<>(); x
        List<List<Integer>> ret = new ArrayList<>();
        for (int i = 0; i <= numRows - 1; i++) {
            List<Integer> row = new ArrayList<>();
            for (int j = 0; j <= i; j++) {
                if (j == 0 || j == i) {
                    row.add(1);
                } else {
                    row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j));
                }
            }
            ret.add(row);
        }
        return ret;
    }

    public static void main(String[] args) {
        System.out.println(new Pascal_Triangle().generate(5));
    }
}