LeetCode系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
题目
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例:
输入: rowIndex = 3
输出: [1,3,3,1]
输入: rowIndex = 0
输出: [1]
输入: rowIndex = 1
输出: [1,1]
提示:
0 <= rowIndex <= 33
进阶:
你可以优化你的算法到 O(rowIndex) 空间复杂度吗?
思路
这个题目怎么说呢,和上一个极其相似,只不过上一个是让返回指定行数的所有结果,而这个是返回指定行的结果,所以思路和上一个差不多:
- 首先我们定义
num用来存储结果 - 从
0开始遍历行数 - 先定义一个数组
temp用来存储本次循环的结果,因为每行第一项都为1,所以我们先赋上初始值1,然后获取上一个数组upRow - 因为
temp有初始项1,所以我们从第二项开始内层循环,每一项的值均为 上一个数组对应项的前一项 加上 上一个数组对应项的值,当为最后一项时,上一数组对应项不存在则取0 - 内层循环结束后将
temp存入结果num中 - 外层循环结束返回
num的最后一项即可
代码实现
/**
* @param {number} rowIndex
* @return {number[]}
*/
var getRow = function(rowIndex) {
// 存储结果
let num = []
// 遍历行
for(let row = 0; row <= rowIndex; row++) {
// 初始化 1
let temp = [1]
// 获取上一行数组
let upRow = num[row-1]
// 第二项开始遍历
for(let i = 1; i <= row; i++) {
// 值为上一行数组 对应前一项 和 对应项 之和
temp.push(upRow[i - 1] + (upRow[i] || 0))
}
// 将数组存入结果
num.push(temp)
}
// 返回最后一项的结果
return num.pop()
};
优化
不过这个题目还给了个进阶的要求,希望可以把空间复杂度优化到 O(rowIndex):
var getRow = function(rowIndex) {
// 存储结果
const row = new Array(rowIndex + 1).fill(0)
// 初始化第一项
row[0] = 1
// 遍历行,处理每一行的数据
for (let i = 1; i <= rowIndex; ++i) {
// 遍历列,处理当前行的数据
for (let j = i; j > 0; --j) {
// 赋值当前项
row[j] += row[j - 1]
}
}
// 返回结果
return row
};