leetcode#119 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?

解释

给定一个索引值k,要求返回杨辉三角的第k行(假设从第0行开始计数,第0行为[1] )。

是否能够将算法的空间复杂度控制在O(k)内?

我的解法

利用数组

本题是leetcode118的变形,如果只要求返回第k行,那么就不需要维持一个二维数组,只需要维持一个前置数组即可。由于本题从第0行开始计数,第0行为[1] ,所以最后,前置数组将保存第rowIndex 行(程序中表示为rowIndex+1 行)的数据,然后再将数组中的数据依次添加进链表中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> list = new ArrayList<Integer>();
int[] preArray = {0};
for(int i = 1; i <= rowIndex+1; i++) {
int[] layer = new int[i];
layer[0] = 1;
layer[i - 1] = 1;
for(int j = 1; j < (i+1)/2; j++) {
layer[j] = preArray[j] + preArray[j-1];
layer[i-1-j] = layer[j];
}
preArray = layer;
}
for(int k = 0; k < rowIndex+1; k++) {
list.add(preArray[k]);
}
return list;
}
}

利用链表

每次向链表的末尾(有的解法是向链表的头部)添加一个1 ,然后反方向将两个相邻元素相加,作为当前位置上的新元素,即在上一层数据构成的链表的本身进行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> list = new ArrayList<Integer>();
if(rowIndex < 0) return list;
for(int i = 1; i <= rowIndex + 1; i++) {
list.add(i - 1, 1);
for(int j = i - 2; j > 0; j--) {
list.set(j, list.get(j) + list.get(j-1));
}
}
return list;
}
}

大神解法

类似上述第二种算法,只不过从头部添加新的元素1

1
2
3
4
5
6
7
8
9
10
11
12
13
public List<Integer> getRow(int rowIndex) {
List<Integer> list = new ArrayList<Integer>();
if (rowIndex < 0)
return list;
for (int i = 0; i < rowIndex + 1; i++) {
list.add(0, 1);
for (int j = 1; j < list.size() - 1; j++) {
list.set(j, list.get(j) + list.get(j + 1));
}
}
return list;
}