码迷,mamicode.com
首页 > 其他好文 > 详细

Pascal's Triangle II

时间:2015-03-12 22:26:33      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

https://leetcode.com/problems/pascals-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?

解题思路:

比较简单的递推,每一行都从左至右算。要用一个变量存储j-1的值,留给后面的值加。同样当前j的值也要存下来,作为后面的pre。每行的最后一个1拿出来单独处理。下标较多,注意不能写错。

public class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> result = new ArrayList<Integer>();
        if(rowIndex < 0){
            return result;
        }
        result.add(1);
        for(int i = 1; i < rowIndex + 1; i++){
            int pre = 1;
            for(int j = 1; j < i; j++){
                int temp = result.get(j);
                result.set(j, pre + result.get(j));
                pre = temp;
            }
            //每行最后一个元素1,放在循环外单独处理
            result.add(1);
        }
        return result;
    }
}

网上看到人家更为好的方法,使用的内存都是k,但是不需要两个临时变量了。因为num[i][j]=num[i - 1][j -1] + num[i - 1][j],当前值要被后面的值用到,所以要用临时变量存。如果反过来,从后往前处理,就不必要临时变量了。这个做法和以前dp(动态规划)问题很像。有些需要二维数组保存状态值的,只需要一维数组就可以了,用的也是这个方法。

要注意实现声明一个n的ArrayList<Integer>,但是它的size仍然是0的,如果直接取下标仍然会越界,这和数组不同,不是默认为0。所以处理第j层,index只能从j-1开始,否则会越界。第j个元素只能单独add(1)。

public class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> result = new ArrayList<Integer>(rowIndex + 1);
        if(rowIndex < 0){
            return result;
        }
        result.add(1);
        for(int i = 1; i < rowIndex + 1; i++){
            for(int j = i - 1; j > 0; j--){
                result.set(j, result.get(j) + result.get(j - 1));
            }
            result.add(1);
        }
        return result;
    }
}

java里,数组就可以默认将每个值都赋值为0。但是注意return Arrays.asList(result);这个代码对于int[]是不能用的,等于返回类似于Arrays.asList(new Object[] { new int[] { 1, 2 } })。这个方法只能用于Integer[]这样的类数组,不能用于primitive数组,这是java语言一个要注意的地方。详细可以参见:http://www.importnew.com/14996.html

public class Solution {
    public List<Integer> getRow(int rowIndex) {
        int[] result = new int[rowIndex + 1];
        result[0] = 1;
        
        for(int i = 1; i < rowIndex + 1; i++){
            for(int j = i; j > 0; j--){
                result[j] = result[j] + result[j - 1];
            }
        }
        // return Arrays.asList(result);
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0; i < rowIndex + 1; i++){
            list.add(result[i]);
        }
        return list;
    }
}

 

Pascal's Triangle II

标签:

原文地址:http://www.cnblogs.com/NickyYe/p/4333458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!