Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
力扣第119题 杨辉三角 II
如下所示:
给定一个非负索引 rowIndex
,返回「杨辉三角」的第 rowIndex
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0
输出: [1]
一、思路
这一题与前面一题非常类似,唯一的不同就是只需要获取第 rowIndex
行的数据即可。其实是可以直接使用前面一题的思路,先将整个 杨辉三角
构造出来,然后再返回最后一行的数据即可。
但是既然是进阶题目,我们就得按照他的进阶要求来。进阶的要求如下:
题目要求我们只能只用额外的 O(rowIndex)
空间,显然用二维数组来存储整个 杨辉三角
的元素是行不通的。
我们不妨观察以下相邻的两行间有什么规律呢?
我们发现当前行的结果仅与前面一行的结果相关联,且每一行的第一个元素和最后一个元素都为 1。那么怎么样才能只使用 O(rowIndex)
空间来实现呢?
既然 arr[i][j] = arr[i-1][j] + arr[i-1][j-1]
(arr[i][j]
不为外层元素),说明当前元素的值只与前面一行的第 i
和 i-1
个元素有关。
那么我们不妨使用一维数组 arr[]
来存储前面一行元素的值,则会有arr[i] = arr[i] + arr[i-1]
(因为 arr[i] 中存储的是上一行的第 i 个元素
)
既然思路有了,那么实现起来也就不难了。
二、实现
实现代码
由于第一列一定为 1
我们可以在初始的时候就像数组中添加 1
。如当前元素为最后一个元素,我们也需要向数组中添加 1
,因为在计算下一行结果的时候需要用到。
public List<Integer> getRow(int rowIndex) {
List<Integer> ret = new ArrayList<>();
ret.add(1); // 初始化第一列
for (int i=0; i<rowIndex+1; i++){
for (int j=i; j>0; j--){
if (j==i){ // 当前行最后一个元素
ret.add(1);
} else { // 非边缘元素
ret.set(j, ret.get(j) + ret.get(j-1));
}
}
}
return ret;
}
测试代码
public static void main(String[] args) {
List<Integer> list = new Number119().getRow(4);
System.out.println(list.size());
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~