杨辉三角 II LeetCode刷题笔记 二、思路分析

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


  • 相关文章

LeetCode刷题汇总:LeetCode刷题

一、题目描述


杨辉三角二

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

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

+ ![image.png](https://gitee.com/songjianzaina/juejin_p16/raw/master/img/c7c9bbbb0a9b94163a41173c9f42a976fddb5e7b3aaa7bfcc1ff07d2ff8448c5)
+ 前面做了杨辉三角一,今天竟然又刷到了二,二话不说,盘他!
+ [大鱼刷题--杨辉三角一](https://dev.newban.cn/7001638318630764574)二、思路分析

======


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



1
2
ini复制代码输入: rowIndex = 3
输出: [1,3,3,1]
+ 示例2:
1
2
ini复制代码输入: rowIndex = 0
输出: [1]
+ 示例3: +
1
2
ini复制代码输入: rowIndex = 1
输出: [1,1]
+ 提示:`0 <= rowIndex <= 33` + **进阶:** - 你可以优化你的算法到 `*O*(*rowIndex*)` 空间复杂度吗? + 咋一看,好像和一没啥区别呀。别急,我们来理一理 - 一是给定一个非负整数 *`numRows`,* 生成「杨辉三角」的前 *`numRows`* 行。 - 二是给定一个非负索引 `rowIndex`,返回「杨辉三角」的第 `rowIndex` 行。 - 我第一反应就是,在第一个的前提上,得到n+1行不就完事了嘛? - 在一个list上取值替换值进行计算,参与下一个计算得到最终行。三、AC 代码

=======


+ 循环记录法:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ini复制代码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](https://gitee.com/songjianzaina/juejin_p16/raw/master/img/335db86d734e81b164929b5243609a3488add632aa3361bebaab13bc234a30f5) - 好像没啥毛病对吧? + 我这笨蛋脑子,高级的不适合我。。老规矩,学习下大神们的玩法,`研究`透了不就是我自己的东西了嘛?哇哈哈哈 + 官方线性递推解法:
1
2
3
4
5
6
7
8
9
10
csharp复制代码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](https://gitee.com/songjianzaina/juejin_p16/raw/master/img/98eb0a42595c9d677109797cc21f8dc082ae555a36dfb0578faca3cc70442756) - 官方解释: * ![image-20211104210644875.png](https://gitee.com/songjianzaina/juejin_p16/raw/master/img/3da3220d7559b4c4fb3c115b08369d168dc530a3060db7fcbe47ac87998b3077) + 给定了索引值,可以直接知道是第几行了。 + 那么可以直接通过循环得到当前的内容。 + 比如: - rowIndex = 3; - 最左边和最右边肯定是1 。那么起始值肯定是1。 - 第一遍循环可以得到 * `row.get(i - 1)`= `row.get(1-1)`= `1` * `(rowIndex - i + 1) / i`= `(3- 1 + 1) / 1`= `3` - 第二遍循环自然结果就是 `3`、`1`。 - 那么组合之后自然而然就是我们要的结果啦!

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

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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%