Passion and Patience

Work Hard, Play Hard

导航

Leecode 杨辉三角

Day 7 刷题

我的解题思路:按照杨辉三角的生成原理,行列交替循环。本方法消耗的空间复杂度和时间复杂度都很大,因为使用list操作获取上一层信息!此外需要学习建立list层的方法:list.add(new LinkedList<>()).
class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<>();

        // 添加层数
        list.add(new LinkedList<>()); 
        list.get(0).add(1);

        for(int i=1; i<numRows;i++){
            list.add(new LinkedList<>());
            List<Integer> dp = new ArrayList<Integer> ();
            dp.add(1);
            for(int j = 1;j<i;j++){
                dp.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
            }            
            dp.add(1);
            list.get(i).addAll(dp);
        }
        return list;
    }
}
阿白想进大厂的动态规划解题思路:

定义状态dp[i][j]为杨辉三角中第i行第j列(行列索引从0开始)的元素值。状态转移方程为:dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j],其中 dp[i-1][j-1]和dp[i- 1][j]是当前元素左上方和上方的元素值。 需要注意的是,每一行的第一个元素和最后一个元素都是1,即当j=0或j=i 时,dp[i][j] = 1。

Hardcore EinsteinSGt的代码

    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();
        int[][] dp = new int[numRows][numRows];
        dp[0][0] = 1;
        result.add(new ArrayList<Integer>(){{ add(dp[0][0]);}});
        if (numRows == 1) {
            return result;
        }

        for (int i = 1; i < numRows; i++) {
            List<Integer> num = new ArrayList<>();
            dp[i][0] = 1;
            num.add(dp[i][0]);
            for (int j = 1; j < i; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
                num.add(dp[i][j]);
            }
            dp[i][i] = 1;
            num.add(dp[i][i]);
            result.add(num);
        }
        return result;
    }

posted on 2024-03-21 13:01  安静的聆  阅读(6)  评论(0编辑  收藏  举报