Pascal's Triangle II leetcode

来源:互联网 发布:热力学数据计算软件 编辑:程序博客网 时间:2024/06/15 22:45

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;    }};


0 0
原创粉丝点击