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());
}
}
本文介绍了解决 LeetCode 第 119 题帕斯卡三角形 II 的一种优化算法,该算法仅使用 O(k) 的额外空间,通过动态规划思想,每次计算一行帕斯卡三角形,从后向前更新数组元素,避免了传统解法中的 O(2k) 空间复杂度。

1267

被折叠的 条评论
为什么被折叠?



