题目: 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
1 class Solution { 2 public List<List<Integer>> generate(int numRows) { 3 List<List<Integer>> res = new ArrayList<List<Integer>>(numRows); 4 // i 是横向list的长度 5 for (int i = 1; i <= numRows; i++) { 6 List<Integer> lis = new ArrayList<Integer>(i); 7 lis.add(0, 1); 8 if (i < 2) { 9 // 这边一开始忘记了 10 res.add(lis); 11 continue; 12 } 13 for (int j = 1; j < i - 1; j++) { 14 List<Integer> prelis = res.get(i - 2); 15 lis.add(j, prelis.get(j-1) + prelis.get(j)); 16 } 17 lis.add(i - 1, 1); 18 res.add(lis); 19 } 20 return res; 21 } 22 }
看了评论才知道我这种解法是【动态规划】迭代
动态规划(Dynamic Programming,所以我们简称动态规划为DP),动态规划是一种编程原理,可以通过将非常复杂的问题划分为更小的子问题来解决。这个原则与递归很类似,但是与递归有一个关键点的不同,就是每个不同的子问题只能被解决一次
Arrays.asList的作用是将数组转化为list
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
题目二: 在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
这一题没想出来,别人的写法:(啊脑阔疼,先休息一下)
fill()方法使用参考
声明举例:
public static void fill(int[] a, form, to, int var)
参数:
a--数组
form--替换开始位置(包括)
to--替换结束位置(不包括)
var--要替换的值
1 public List<Integer> getRow(int rowIndex) { 2 List<Integer> ls = new ArrayList<>(); 3 ls.add(1); 4 for (int i = 1;i <= rowIndex;i++){ 5 ls.add(1); 6 for (int j = i-1;j > 0;j--) 7 ls.set(j, ls.get(j)+ls.get(j-1)); 8 } 9 return ls; 10 }
1 public List<Integer> getRow(int rowIndex) { 2 Integer[] dp = new Integer[rowIndex + 1]; 3 Arrays.fill(dp,1); 4 for(int i = 2;i < dp.length;i++){ 5 for(int j = i - 1;j > 0;j--) 6 dp[j] = dp[j] + dp[j - 1]; 7 } 8 List<Integer> res = Arrays.asList(dp); 9 return res; 10 }