LeetCode-119-杨辉三角 II
in LeetCode with 0 comment

LeetCode-119-杨辉三角 II

in LeetCode with 0 comment

原题地址:杨辉三角 II

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

PascalTriangleAnimated2

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

示例:

输入: 3
输出: [1,3,3,1]

进阶:

你可以优化你的算法到 $O(k)$ 空间复杂度吗?

解答

前一题 的求解思路一致,只是因为只需要返回第k行,所以我们也不用保存整个杨辉三角,只用保存上一行的值即可。

具体的实现如下:

/**
 * @param {number} rowIndex
 * @return {number[]}
 */
const getRow1 = function(rowIndex) {
    // 与上一题不同,本题的行数是从0开始计算的
    // 第0行只有一个1
    let result = [1];
    // 从第1行开始处理
    for (let i = 1; i <= rowIndex; i ++) {
        // 第i行的长度为i+1,左右两边的值为1
        let array = new Array(i + 1).fill(1);
        // 处理除两端外剩余的值
        for (let j = 1; j < i; j ++) {
            // 等于上一行左右两边的值之和
            array[j] = result[j - 1] + result[j]
        }
        // 保存当前行用于计算下一行
        result = array;
    }
    return result;
};

测试:

let start = new Date();
const test = getRow1;
console.log(test(0)); // [ 1 ]
console.log(test(3)); // [ 1, 3, 3, 1 ]
console.log(test(5)); // [ 1, 5, 10, 10, 5, 1 ]
console.log(new Date().getTime() - start.getTime()); // 10

时间复杂度: 与前一题相同,时间复杂度为$O(K^2)$
空间复杂度: 不用保存整个杨辉三角,只用保存一行,空间复杂度为$O(K)$