Pascal's Triangle II leetcode

给定一个索引 k,返回帕斯卡三角形的第 k 行。例如,当 k = 3 时,返回 [1, 3, 3, 1]。优化算法仅使用 O(k) 的额外空间,从后往前遍历以避免覆盖所需数据,时间复杂度为 O(n^2),空间复杂度为 O(k)。" 114548853,10542871,Java Apache POI 获取Excel单元格背景颜色,"['Java开发', 'Excel处理', 'Apache POI']
摘要由CSDN通过智能技术生成

Given an index k, return the kth row of the Pascal's triangle.

For example, given k = 3,
Return [1,3,3,1].

Note:
Could you optimize your algorithm to use only O(k) extra space?

 [1,3,3,1],
 [1,4,6,4,1]
拿上面这两行为例,每一个元素其实只与它上面一个和左上那一个元素相关。也就是说,如果要生成元素的下标是i的话,它只和i和i-1相关。所以我们可以用从后往前的顺序原地生成后一行。这样就不用任何辅助空间了。

而这里我们只需要一行数据,就得考虑一下是不是能只用一行的空间来存储结果而不需要额外的来存储上一行呢?这里确实是可以实现的。对于每一行我们知道如果从前往后扫,第i个元素的值等于上一行的res[i]+res[i+1],可以看到数据是往前看的,如果我们只用一行空间,那么需要的数据就会被覆盖掉。所以这里采取的方法是从后往前扫,这样每次需要的数据就是res[i]+res[i-1],我们需要的数据不会被覆盖,因为需要的res[i]只在当前步用,下一步就不需要了。这个技巧在动态规划省空间时也经常使用,主要就是看我们需要的数据是原来的数据还是新的数据来决定我们遍历的方向。时间复杂度还是O(n^2),而空间这里是O(k)来存储结果,仍然不需要额外空间。代码如下:

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        vector<int> res;
        if(rowIndex<0)
        return res;
        for(int k=0;k<=rowIndex;k++) {
            res.push_back(1);
            for(int j=k-1;j>0;j--) {
                res[j] = res[j]+res[j-1];
            }
        }
        return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值