这道题是LeetCode里的第119道题。
题目描述:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3 输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
直接把 118 的拿过来改改就行了呗!偷懒可以,但是该学的算法还是得学啊!
其实这题可以算是一道动态规划的题目了,试想一下,我们需要的是第 n 行的数据,那么第 n 行有 n + 1 个数据项,我们为什么不先创建一个 n + 1 的数组呢?然后根据已知转移方程:dp[ j ] = dp[ j - 1 ] + dp[ j ],边界 0 < j <= i;i <= n,就完成了?真的完成了吗?注意到 dp[ j ] = dp[ j - 1 ] + dp[ j ] 是原地修改的数组,假设我们先计算 dp[ 1 ] = dp[ 0 ] + dp[ 1 ],然后再计算 dp[ 2 ] = dp[ 1 ] + dp[ 2 ],这个时候我们就发现了,dp[ 1 ] 的值已就被修改了,它已经不是想要的值了!那么得出来的 dp[ 2 ] 肯定是错误的!怎么办?大家肯能先想到的是在创建一个数组,记录前面的值,相互交替的修改,但是还有一种更好的方法,我们可以不用再创建一个数组,我们直接反向做加法:先计算 dp[ n ] = dp[ n - 1 ] + dp[ n ],再计算 dp[ n - 1 ] = dp[ n - 2 ] + dp[ n - 1 ],此时数组的数据就是我们想要的数据。
解题代码:
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> res = new ArrayList<Integer>();
if (rowIndex < 1) {
res.add(1);
return res;
}
int[] dp = new int[rowIndex + 1];
dp[0] = 1;
for (int i = 1; i <= rowIndex; i++) {
for (int j = i; j > 0; j--) {
dp[j] = dp[j - 1] + dp[j];
}
}
for (int i = 0; i < dp.length; i++) {
res.add(dp[i]);
}
return res;
}
}
提交结果:
个人总结:
立马就想到了动态规划,看来动态规划虐我不浅啊!另一种好的办法是使用组合数,计算阶乘。