杨辉三角 II | LeetCode刷题笔记

603 阅读1分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战


  • 相关文章

    LeetCode刷题汇总:LeetCode刷题

    一、题目描述


    杨辉三角二

    给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

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

    • image.png

    二、思路分析


    • 看看题目的示例,我们来理一理这个思路~

    • 示例 1:

      输入: rowIndex = 3
      输出: [1,3,3,1]
      
    • 示例2:

      输入: rowIndex = 0
      输出: [1]
      
    • 示例3:

    • 输入: rowIndex = 1
      输出: [1,1]
      
    • 提示:0 <= rowIndex <= 33

    • 进阶:

      • 你可以优化你的算法到 *O*(*rowIndex*) 空间复杂度吗?
    • 咋一看,好像和一没啥区别呀。别急,我们来理一理

      • 一是给定一个非负整数 numRows 生成「杨辉三角」的前 numRows 行。
      • 二是给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
      • 我第一反应就是,在第一个的前提上,得到n+1行不就完事了嘛?
      • 在一个list上取值替换值进行计算,参与下一个计算得到最终行。

    三、AC 代码


    • 循环记录法:

      class Solution {
          public List<Integer> getRow(int rowIndex) {
              //定义list集合
              List<Integer> list = new ArrayList<>(1);
              list.add(1);
              for (int i = 1; i < rowIndex + 1; i++) {
                  //定义临时存储集合
                  List<Integer> newList = new ArrayList<>();
                  newList.add(1);
                  for (int j = 0; j < list.size() - 1; j++) {
                      //计算累加量
                      newList.add(list.get(j) + list.get(j + 1));
                  }
                  newList.add(1);
                  list = newList;
              }
              return list;
          }
      }
      
      • image-20211104210219204.png
      • 好像没啥毛病对吧?
    • 我这笨蛋脑子,高级的不适合我。。老规矩,学习下大神们的玩法,研究透了不就是我自己的东西了嘛?哇哈哈哈

    • 官方线性递推解法:

      class Solution {
          public List<Integer> getRow(int rowIndex) {
              List<Integer> row = new ArrayList<Integer>();
              row.add(1);
              for (int i = 1; i <= rowIndex; ++i) {
                  row.add((int) ((long) row.get(i - 1) * (rowIndex - i + 1) / i));
              }
              return row;
          }
      }
      
      • image-20211104210501001.png

      • 官方解释:

        • image-20211104210644875.png
    • 给定了索引值,可以直接知道是第几行了。

    • 那么可以直接通过循环得到当前的内容。

    • 比如:

      • rowIndex = 3;

      • 最左边和最右边肯定是1 。那么起始值肯定是1。

      • 第一遍循环可以得到

        • row.get(i - 1)= row.get(1-1)= 1
        • (rowIndex - i + 1) / i= (3- 1 + 1) / 1= 3
      • 第二遍循环自然结果就是 31

      • 那么组合之后自然而然就是我们要的结果啦!


路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah