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