LeetCode119、 杨辉三角II

67 阅读1分钟

LeetCode 系列记录我学习算法的过程。

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

题目

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例:

image.png

输入: 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()
};

image.png

优化

不过这个题目还给了个进阶的要求,希望可以把空间复杂度优化到 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
};

image.png