leetcode 119. Pascal's Triangle II(空间问题)

 题目要求是only O(k) 额外空间。我们考虑每个结果都只是与其前一个结果相关,因此我们考虑只多开辟一个空间pre用于保存前一次的结果。

class Solution {
   public List<Integer> getRow(int rowIndex) {
        List<Integer> curr = new LinkedList<>(), prev = new LinkedList<>();
        prev.add(1);
        if(rowIndex == 0) return prev;
        prev.add(1);
        if(rowIndex == 1) return prev;
        for(int i=2; i <= rowIndex; i++){
            //curr = new LinkedList<>();
            curr.add(1);
            for(int j=0; j+1 < prev.size(); j++)
                curr.add(prev.get(j)+prev.get(j+1));
            curr.add(1);
            prev = curr; 
        }
        return curr;
    }
}

上述做法导致了空间超过限制条件。因为红色部分也开辟了一个固有空间,每次都会在该空间上增加数字。

正确做法如下:

class Solution {
   public List<Integer> getRow(int rowIndex) {
        List<Integer> curr = null, prev = new LinkedList<>();
        prev.add(1);
        if(rowIndex == 0) return prev;
        prev.add(1);
        if(rowIndex == 1) return prev;
        for(int i=2; i <= rowIndex; i++){
            curr = new LinkedList<>();
            curr.add(1);
            for(int j=0; j+1 < prev.size(); j++)
                curr.add(prev.get(j)+prev.get(j+1));
            curr.add(1);
            prev = curr; 
        }
        return curr;
    }
}

上述做法使得每次进入循环时会动态开辟一块新空间,相当于这个list是全新的,刚开始没有数据的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值