Thursday, April 2, 2015

Pascal's Triangle II

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?
Solution1: 不限制空间
如果没有这个O(k)空间的限制,那么可以一行一行迭代生成。如果要直接生成第i行,假设生成k=3,可以这样考虑这样的一个过程:
1 0 0 0    k = 0
1 1 0 0    k = 1
1 1 1 0
1 2 1 0    k = 2
1 2 1 1
1 2 3 1
1 3 3 1    k = 3
上述过程实际上就是一个in-place的迭代过程。每当生成下一行的时候,首先数组相应位置1,然后从右向左计算每一个系数。
public class Solution {
    public ArrayList getRow(int rowIndex) {
        ArrayList current = new ArrayList();
        for(int i = 0; i <= rowIndex; i++) {
            current.add(0);
        }
        current.set(0, 1);
        
        for(int i = 1; i <= rowIndex; i++) {
            current.set(i, 1);
            for(int j = i - 1; j > 0; j--) {
                int temp = current.get(j) + current.get(j - 1);
                current.set(j, temp);
            }
        }
        return current;
    }
}
Solution2: only O(k) extra space
从后往前扫,每次需要的数据就是res[i]+res[i-1],我们需要的数据不会被覆盖,因为需要的res[i]只在当前步用,下一步就不需要了。这个技巧在动态规划省空间时也经常使用,主要就是看我们需要的数据是原来的数据还是新的数据来决定我们遍历的方向。
时间复杂度还是O(n^2),而空间这里是O(k)来存储结果。
public class Solution {
    public List getRow(int rowIndex) {
        ArrayList res = new ArrayList();
        if(rowIndex < 0) {
            return res;
        }
        
        res.add(1);
        for(int i = 1; i <= rowIndex; i++) {
            for(int j = res.size() - 2; j >= 0; j--) {
                res.set(j + 1, res.get(j) + res.get(j + 1));
            }
            res.add(1);
        }
        
        return res;
    }
}
Reference: http://blog.csdn.net/linhuanmars/article/details/23311629

No comments:

Post a Comment