题目
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
- 你可以优化你的算法到 O(k) 空间复杂度吗?
解答
解法一:空间O(k^2)
参考 Leetcode 118. 杨辉三角 ,拿到前 n 行, 返回最后一行就好了。
详情在上一篇博客:https://blog.csdn.net/LetJava/article/details/95815823
代码
class Solution {
public List<Integer> getRow(int rowIndex) {
List<List<Integer>> res = new ArrayList<>();
res.add(new ArrayList<Integer>(Arrays.asList(1)));
for(int i = 1; i <= rowIndex; i ++) {
List<Integer> row = new ArrayList<>();
for(int j = 0; j <= i; j ++) {
int left = j == 0 ? 0 : res.get(i - 1).get(j - 1);
int right = j == i ? 0 : res.get(i - 1).get(j);
row.add(left + right);
}
res.add(row);
}
return res.get(res.size() - 1);
}
}
结果
解法二:空间O(k)
使用一个 O(k) 的空间,重用原有空间
特别注意点:需要从 每行最后面 开始更新元素,避免因为改变前一个元素而影响到后面的元素。
代码
class Solution {
public List<Integer> getRow(int rowIndex) {
Integer[] res = new Integer[rowIndex + 1];
res[0] = 1;
for(int i = 1; i <= rowIndex; i ++) {
for(int j = i; j >= 0; j --) {
int left = j == 0 ? 0 : res[j - 1];
int right = j == i ? 0 : res[j];
res[j] = left + right;
}
}
return Arrays.asList(res);
}
}