爱敲代码的小杨.

爱敲代码的小杨.

【每日一题】4.LeetCode——杨辉三角-LMLPHP

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

【每日一题】4.LeetCode——杨辉三角-LMLPHP

1.题目描述

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

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

【每日一题】4.LeetCode——杨辉三角-LMLPHP

示例1

示例2

提示:

  • 1 <= numRosw <= 30

题目链接🔗

2. 解题思路

杨辉三角的性质:

  1. 三角形的每一行的第一个数字和最后一个数字都是1。
  2. 每一个三角的元素等于上一行此位置左边的元素与上一行此位置元素的和。

题解:

杨辉三角的第0行只有一个数:1。对于 1 ≤ i < numRows。用pervRow表示杨辉三角的第 i - 1行,用curRow表示杨辉三角的第 i 行.

  1. 将 1 添加到curRow,表示当前行的首个数是1
  2. 当前行的中间 i - 1个数分别等于其上方两数之和,因此对于 1 <= j < i,有curRow[j] = pervRow[j] + pervRow[j - 1] ,依次将每个pervRow[j] + pervRow[j - 1]添加到curRow中。
  3. 将 1添加到curRow,表示当前行的末尾数是1.
  4. 此时得到完整的curRow,将curRow添加到杨辉三角。

3. 代码

class Solution {
    public List<List<Integer>> generate(int numRows) {
        // 定义一个二维数组
        List<List<Integer>> ret = new ArrayList<>();

        List<Integer> list = new ArrayList<>();
        list.add(1);

        ret.add(list);

        for (int i = 1; i < numRows; i++) {
            // 每循环一次 就是一行
            List<Integer> curRow = new ArrayList<>();
            curRow.add(1); // 一行的第一个元素

            // 处理中间元素
            List<Integer> pervRow = ret.get(i - 1);
            for (int j = 1; j < i; j++) {
                int x = pervRow.get(j) + pervRow.get(j - 1);
                curRow.add(x);
            }

            //最后一个元素
            curRow.add(1);

            ret.add(curRow);
        }
        return ret;
    }
}

运行结果:

【每日一题】4.LeetCode——杨辉三角-LMLPHP

4. 复杂度分析

  • 时间复杂度:O(numRows),因为计算总数为 1 + 2 + 3 + …+ numRows。
  • 空间复杂度:O(numRows),因为每次计算都会被保留下来,因此空间复杂度的规模与时间复杂度相同。
    【每日一题】4.LeetCode——杨辉三角-LMLPHP
01-26 12:45