「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
-
相关文章
LeetCode刷题汇总:LeetCode刷题
一、题目描述
给定一个非负索引
rowIndex
,返回「杨辉三角」的第rowIndex
行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
- 前面做了杨辉三角一,今天竟然又刷到了二,二话不说,盘他!
- 大鱼刷题--杨辉三角一
二、思路分析
-
看看题目的示例,我们来理一理这个思路~
-
示例 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; } }
- 好像没啥毛病对吧?
-
我这笨蛋脑子,高级的不适合我。。老规矩,学习下大神们的玩法,
研究
透了不就是我自己的东西了嘛?哇哈哈哈
-
官方线性递推解法:
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