Pascal's Triangle II

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)