【LeetCode】#119. 杨辉三角 II
给定一个非负索引 rowIndex
,返回「杨辉三角」的第 rowIndex
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3 输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0 输出: [1]
示例 3:
输入: rowIndex = 1 输出: [1,1]
方法一:数学
但与上一题不同的是,不用求出所有行只需给出特定的一行。那么这里用pre代替上一行,减少内存消耗。 class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> pre = new ArrayList<Integer>(); for(int i = 0; i <= rowIndex ; i++){ List<Integer> a = new ArrayList<Integer>(); for(int j = 0; j <= i; j++){ if(j == i || j == 0){ a.add(1); }else{ a.add(pre.get(j) + pre.get(j - 1)); } } pre = a; } return pre; } }
能否只用一个数组呢?
递推式
表明,当前行第 ii 项的计算只与上一行第 i-1i−1 项及第 ii 项有关。因此我们可以倒着计算当前行,这样计算到第 ii 项时,第 i-1i−1 项仍然是上一行的值。
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(0); for (int j = i; j > 0; --j) { row.set(j, row.get(j) + row.get(j - 1)); } } return row; } }
方法二:线性递推

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; } }
知识点:
当动态规划的题目时,只需保存上一状态可以减少内存占用。
总结:
数学没学好。
本文作者:Canyooo
本文链接:https://www.cnblogs.com/canyooo/p/15333404.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步