118. 杨辉三角

https://leetcode.cn/problems/pascals-triangle/

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 :

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
public class hot118 {
    //动态规划
    public List<List<Integer>> generate(int numRows) {
        // 结果列表,用于存储杨辉三角的所有行
        List<List<Integer>> res = new ArrayList<>();

        // 遍历每一行
        for (int i = 0; i < numRows; i++) {
            // 创建当前行的列表
            List<Integer> row = new ArrayList<>();

            // 遍历当前行的每一个元素,从第0个到第i个(每行有i+1个元素)
            for (int j = 0; j <= i; j++) {
                // 判断是否为行首或行尾元素
                if (j == 0 || j == i) {
                    // 杨辉三角的边界条件:每行的第一个和最后一个元素都是1
                    row.add(1);
                } else {
                    // 中间元素的计算:等于左上方和右上方元素的和
                    // 左上方元素:上一行第(j-1)个元素
                    int left = res.get(i - 1).get(j - 1);
                    // 右上方元素:上一行第j个元素
                    int right = res.get(i - 1).get(j);
                    // 将两者的和添加到当前行
                    row.add(left + right);
                }
            }

            // 将构建好的当前行添加到结果列表中
            res.add(row);
        }

        // 返回完整的杨辉三角
        return res;
    }

    //基于前一行生成新行
    public List<List<Integer>> generate2(int numRows) {
        List<List<Integer>> res = new ArrayList<>();

        if (numRows == 0) return res;

        // 添加第一行
        List<Integer> firstRow = new ArrayList<>();
        firstRow.add(1);
        res.add(firstRow);

        // 基于前一行生成当前行
        for (int i = 1; i < numRows; i++) {
            List<Integer> prevRow = res.get(i - 1);
            List<Integer> currentRow = new ArrayList<>();

            currentRow.add(1); // 行首

            // 计算中间元素
            for (int j = 1; j < i; j++) {
                int sum = prevRow.get(j - 1) + prevRow.get(j);
                currentRow.add(sum);
            }

            currentRow.add(1); // 行尾
            res.add(currentRow);
        }

        return res;
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值