LeetCode解题 119:Pascal's Triangle II
Problem 119: Pascal’s Triangle II [Easy]
Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal’s triangle.
Note that the row index starts from 0.
In Pascal’s triangle, each number is the sum of the two numbers directly above it.
Example:
Input: 3
Output: [1,3,3,1]
Follow up:
Could you optimize your algorithm to use only O(k) extra space?
来源:LeetCode
解题思路
在上一题题解118:Pascal’s Triangle中,计算每一层都保留了上一层的结果,空间复杂度为
O
(
2
k
)
O(2k)
O(2k)。本题中要求只使用
O
(
k
)
O(k)
O(k)的额外空间,则可以进一步使用动态规划的思想,只需保存一个数组,每一层计算时从后往前计算,num(j)只需要用到num(j)和num(j-1),而且修改num(j)后不会影响到num(j-1)的计算,因此只需要
O
(
k
)
O(k)
O(k)的空间即可。
原118题的公式为:
n
u
m
(
i
,
j
)
=
{
1
j
=
0
;
1
j
=
i
;
n
u
m
(
i
−
1
,
j
−
1
)
+
n
u
m
(
i
−
1
,
j
)
o
t
h
e
r
w
i
s
e
.
num(i, j) = \begin{cases} 1 & j = 0;\\ 1 & j = i;\\ num(i-1, j-1) + num(i-1, j) & otherwise. \end{cases}
num(i,j)=⎩⎪⎨⎪⎧11num(i−1,j−1)+num(i−1,j)j=0;j=i;otherwise.
其中,
n
u
m
(
i
,
j
)
num(i,j)
num(i,j)代表第
i
i
i层第
j
j
j个数。
更新后的公式为:
n
u
m
(
j
)
=
{
1
j
=
0
;
1
j
=
i
;
n
u
m
(
j
−
1
)
+
n
u
m
(
j
)
o
t
h
e
r
w
i
s
e
.
num(j) = \begin{cases} 1 & j = 0;\\ 1 & j = i;\\ num(j-1) + num(j) & otherwise. \end{cases}
num(j)=⎩⎪⎨⎪⎧11num(j−1)+num(j)j=0;j=i;otherwise.
其中,
i
i
i代表层数,
n
u
m
(
j
)
num(j)
num(j)代表每一层第
j
j
j个数,数组
n
u
m
num
num的更新是in-place的。
运行结果:
要点:动态规划
Solution (Java)
class Solution {
public List<Integer> getRow(int rowIndex) {
int[] num = new int[rowIndex+1];
for(int i = 0; i < rowIndex+1; i++){
num[i] = 1;
for(int j = i-1; j > 0; j--){
num[j] = num[j] + num[j-1];
}
num[0] = 1;
}
return Arrays.stream(num).boxed().collect(Collectors.toList());
}
}