LeetCode --- 字符串、数组
简书专栏:https://www.jianshu.com/nb/41796568
知乎专栏:https://zhuanlan.zhihu.com/c_174823416
一、题目描述
来源:力扣(LeetCode)
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。(k从0开始)
示例:
杨辉三角:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
输入: 3
输出: [1,3,3,1]
二、实现思路以及代码
2.1 建立杨辉三角矩阵
在LeetCode --- 118中已经讲解了如何实现杨辉三角的矩阵,我们可以直接创建杨辉三角矩阵,再返回需要返回的行数即可。代码略
2.2 改进创建杨辉三角算法
没有必要创建完整的杨辉三角矩阵,因为要返回第k行只需要第k-1行即可,单独创建一个临时List来存储k-1行,每次循环进行赋值即可
public static List<Integer> getRow1(int rowIndex) {
//这里numRows代表的是从1开始算的行数
int numRows = rowIndex + 1;
if (numRows <= 0) {
return new ArrayList();
}
ArrayList<Integer> preList = new ArrayList<>();
preList.add(1);
for (int i = 2; i <= numRows; i++) {
ArrayList<Integer> aList = new ArrayList<>();
//首字母为1
aList.add(1);
//添加中间元素
for(int j = 1; j < i - 1; j++) {
aList.add(preList.get(j - 1) + preList.get(j));
}
//添加末尾元素
aList.add(1);
preList = aList;
}
return preList;
}
2.3 继续改进
杨辉三角除了前后均为1,中间由上面确定,其实还可以继续优化。直接利用当前行,倒着进行赋值。需要理解一下。
如当前行为1 3 3 1要求下一行
- 首字母为1,不动 cur = 1 3 3 1
- 最后一个字母等于最后一个加倒数第二个。 cur = 1 3 3 4
- 倒数第二个等于倒数第二加倒数第三。cur = 1 3 6 4
- cur = 1 4 6 4
- 最后再添加1 cur = 1 4 6 4 1。即得到了下一行了
因为更新完j的信息后,虽然把j之前的信息覆盖掉了。但是下一次我们更新的是j - 1,需要的是j - 1和j - 2 的信息,j信息覆盖就不会造成影响了
public static List<Integer> getRow2(int rowIndex) {
List<Integer> cur = new ArrayList<>();
//第一个始终是1
cur.add(1);
for (int i = 1; i <= rowIndex; i++) {
//这里只能从后向前,因为第一个元素已经确定为1了
for (int j = i - 1; j > 0; j--) {
cur.set(j, cur.get(j - 1) + cur.get(j));
}
cur.add(1);//补上每层的最后一个 1
}
return cur;
}
网友评论