Will I leave?.|

Canyooo

园龄:3年6个月粉丝:1关注:1

【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 中国大陆许可协议进行许可。

posted @   Canyooo  阅读(35)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 黑洞里 方大同
黑洞里 - 方大同
00:00 / 00:00
An audio error has occurred.

Not available