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

一、题目描述

给定一个非负整数 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. 递推关系:杨辉三角的每一行都可以根据上一行来递推生成,这是解决这类问题的常见方法。

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

相关推荐

  1. 三角算法(leetcode119)

    2024-06-06 08:50:05       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 08:50:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 08:50:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 08:50:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 08:50:05       20 阅读

热门阅读

  1. 【k8s的三种探针】

    2024-06-06 08:50:05       8 阅读
  2. Scala学习笔记7: 对象

    2024-06-06 08:50:05       7 阅读
  3. 小程序真题合集

    2024-06-06 08:50:05       7 阅读
  4. HW面试应急响应之场景题

    2024-06-06 08:50:05       8 阅读
  5. IDEA 开发中一些好用的插件

    2024-06-06 08:50:05       8 阅读
  6. 微信小程序中实现录音功能及其功效

    2024-06-06 08:50:05       6 阅读
  7. 【AI】DeepStream(09):deepstream-app源码详解

    2024-06-06 08:50:05       8 阅读
  8. 从零开始精通Onvif之设备发现

    2024-06-06 08:50:05       13 阅读
  9. 扩展 Kafka 集群从三台节点到四台节点的过程

    2024-06-06 08:50:05       8 阅读
  10. web应用中的robots.txt配置

    2024-06-06 08:50:05       8 阅读
  11. Python爬虫之BeautifulSoup模块

    2024-06-06 08:50:05       9 阅读