「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
- 相关文章
LeetCode刷题汇总:LeetCode刷题
一、题目描述
给定一个非负索引
rowIndex
,返回「杨辉三角」的第rowIndex
行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
+ 
+ 前面做了杨辉三角一,今天竟然又刷到了二,二话不说,盘他!
+ [大鱼刷题--杨辉三角一](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;
}
}
- 
- 好像没啥毛病对吧?
+ 我这笨蛋脑子,高级的不适合我。。老规矩,学习下大神们的玩法,`研究`透了不就是我自己的东西了嘛?哇哈哈哈
+ 官方线性递推解法:
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;
}
}
- 
- 官方解释:
* 
+ 给定了索引值,可以直接知道是第几行了。
+ 那么可以直接通过循环得到当前的内容。
+ 比如:
- 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
本文转载自: 掘金