描述
leetcode119: 杨辉三角2 【简单】
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
1
2 输入: 3
输出: [1,3,3,1]
分析
- 这题和前一题一样,只不过返回特定层,同样的思路
1 | class Solution { |
这题和杨辉三角1的题目差不多,118题需要保存所有的,但是这题只需要返回指定层,因为当前层的值只依赖于上一层的值,故使用一个list来保存上一层的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public List<Integer> getRow(int rowIndex) {
List<Integer> pre = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
for (int i = 0; i <= rowIndex; i++){
cur = new ArrayList<>();
for(int j = 0; j <= i ; j++){
if(j == 0 || i == j){
cur.add(1);
}else{
cur.add(pre.get(j - 1) + pre.get(j));
}
}
pre = cur;
}
return cur;
}基于2可以继续优化:以把 pre 的 List 省去。这样的话,cur每次不去新建 List,而是把cur当作pre。
又因为更新当前
j
的时候,就把之前j
的信息覆盖掉了。而更新j + 1
的时候又需要之前j的信息,所以在更新前,我们需要一个变量把之前j
的信息保存起来。1
2
3
4
5
6
7
8
9
10
11
12
13
14public List<Integer> getRow(int rowIndex) {
int pre = 1;
List<Integer> cur = new ArrayList<>();
cur.add(1); // j == 0
for(int i = 1; i <= rowIndex; i++){
for(int j = 1; j < i; j++){
int tmp = cur.get(j);
cur.set(j, pre + cur.get(j));
pre = tmp;
}
cur.add(1); // j == i
}
return cur;
}除了上边优化的思路,还有一种想法,那就是倒着进行,这样就不会存在覆盖的情况了。因为更新完j的信息后,虽然把
j
之前的信息覆盖掉了。但是下一次我们更新的是j - 1
,需要的是j - 1
和j - 2
的信息,j
信息覆盖就不会造成影响了。
代码
相似题目:杨辉三角