LeetCode题练习与总结:杨辉三角--118

173 篇文章 0 订阅
43 篇文章 0 订阅

一、题目描述

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

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

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

提示:

  • 1 <= numRows <= 30

二、解题思路

这个问题是要求生成杨辉三角的前 numRows 行。杨辉三角的特点是每行的第一个和最后一个元素都是1,其他元素是它正上方元素和左上方元素之和。

解题思路如下:

  1. 创建一个二维列表 result 用于存储杨辉三角的每一行。
  2. 对于每一行,首先添加一个1作为该行的第一个元素。
  3. 对于行号大于1的情况,需要计算中间的元素,每个元素都是它正上方元素和左上方元素之和。
  4. 在每行的最后添加一个1。
  5. 将每一行添加到 result 列表中。
  6. 返回 result 作为最终结果。

三、具体代码

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

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();
        
        for (int i = 0; i < numRows; i++) {
            List<Integer> row = new ArrayList<>();
            row.add(1); // 每行的第一个元素是1
            
            // 计算中间的元素
            for (int j = 1; j < i; j++) {
                row.add(result.get(i - 1).get(j - 1) + result.get(i - 1).get(j));
            }
            
            // 如果不是第一行,每行的最后一个元素也是1
            if (i > 0) {
                row.add(1);
            }
            
            result.add(row);
        }
        
        return result;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 外层循环执行了 numRows 次,这是生成杨辉三角行的次数。
  • 内层循环的执行次数随着行数的增加而增加,第 i 行需要执行 i-1 次。
  • 因此,内层循环的总执行次数是 1 + 2 + 3 + ... + (numRows - 1),这是一个等差数列求和,其和为 (numRows - 1) * numRows / 2
  • 每次内层循环的操作是常数时间的,即 O(1)
  • 所以,总的时间复杂度是 O((numRows - 1) * numRows / 2),这可以简化为 O(numRows^2)
2. 空间复杂度
  • 空间复杂度主要取决于存储杨辉三角所需的二维列表 result
  • result 包含 numRows 行,每行的元素数量从 1 个递增到 numRows 个。
  • 因此,result 中的总元素数量是 1 + 2 + 3 + ... + numRows,这也是一个等差数列求和,其和为 (numRows + 1) * numRows / 2
  • 每个元素的空间是常数大小的,所以总的空间复杂度是 O((numRows + 1) * numRows / 2),这可以简化为 O(numRows^2)

综上所述,给定代码的时间复杂度是 O(numRows^2),空间复杂度也是 O(numRows^2)

五、总结知识点

  1. 杨辉三角:杨辉三角是一个经典的数学问题,其中每个数是它左上方和右上方的数的和。这个问题在计算机科学中经常用来练习动态规划和递归算法。

  2. 二维列表(ArrayList 的嵌套):代码中使用了一个 ArrayList 的嵌套来存储杨辉三角的每一行,每一行也是一个 ArrayList

  3. 循环结构:代码使用了两个嵌套的 for 循环来生成杨辉三角。外层循环用于处理行,内层循环用于处理每行中的元素。

  4. 列表的添加操作:代码中使用了 ArrayList 的 add 方法来向列表中添加新的元素。

  5. 列表的访问操作:代码中使用了 get 方法来访问列表中的元素,以便计算当前行的中间元素。

  6. 边界条件处理:代码中对于每行的第一个和最后一个元素进行了特殊处理,确保每行都以1开始和结束。

  7. 动态规划的思想:虽然代码没有显式地使用动态规划,但它在计算每一行的元素时利用了上一行的结果,这是动态规划的一种应用。

  8. 数组索引:在计算中间元素时,代码使用了数组索引来访问上一行的相邻元素。

  9. 常数时间的操作:除了生成杨辉三角的结构之外,代码中的每次操作(如列表的添加和访问)都是常数时间的。

  10. 递推关系:杨辉三角的每一行都可以根据上一行来递推生成,这是解决这类问题的常见方法。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值