LeetCode之杨辉三角二(简单模拟)

问题描述:

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 行。

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

示例:

输入: 3
输出: [1,3,3,1]

进阶:

你可以优化你的算法到 O(k) 空间复杂度吗?

直接大神代码,今天下午脑袋宕机。

例如这是rowIndex = 6 时的情况
1st: 1=1
2nd: 6= 6 / 1
3rd: 15=6x5 / (1x2)
4th: 20=6x5x4 / (1x2x3)
5th: 15=6x5x4x3 / (1x2x3x4)
6th: 6 =6x5x4x3x2 / (1x2x3x4x5)
7th: 1 =6x5x4x3x2x1 / (1x2x3x4x5x6)

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> res = new LinkedList<>();
         res.add(1);
        if (rowIndex == 0) return res;
        int t = rowIndex, b = 1;
        long cur = 1;
        for(int i = 1; i < rowIndex+1; i++){
            cur = cur * t;
            cur = cur / b;
            res.add((int)cur);
            t--;b++;
        }
        return res;
    }
}

再来个模拟 O(k) 

第k行的长度是k+1,所以用这个长度创建一个ArrayList,然后填满所有的1。

给定行n的值可以从行n-1计算出来,例如:

第n行索引i处的值是第n-1行索引i和i-1处的值的和

正确处理索引绑定,注意每行的第一个和最后一个值总是1。

为了只使用O(k)额外的空间,我们从列表末尾向后计算每一行,

这样我们就可以重用列表,而不用重写任何值,就像从第n-1行开始一样

此问题需要纵向看

1

1  1

1  2  1

1  3  3  1

1  4  6  4  1

class Solution {
    public List<Integer> getRow(int rowIndex) {
        if(rowIndex < 0) return null;
        ArrayList<Integer> res = new ArrayList<>(rowIndex+1);
        for(int k=0; k<=rowIndex; ++k) res.add(1);

        for(int i=1; i<rowIndex; ++i){
            for(int j=i; j>0; --j) {
                res.set(j, res.get(j) + res.get(j-1));
            }
        }
        return res;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值