最终还是没有逃过杨辉三角,哈哈哈哈


118. 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

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

示例:

杨辉三角
输入: 5
输出:

[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

最终还是没能逃掉杨辉三角
这道题其实一个简单的动态规划,因为需要用上一层的数据来求下一层
思路:
首先我们需要了解到,其实下一层每一个值都是从上一层推导来的
我们设i为层数 j为值的下表 如果我们求listi 按照如上思路可得
list[i][j]=list[i-1][j-1]+list[i-1][j]
这里会遇到一个问题:就是开头和结尾怎么办?
有两种思路,一种是开头结尾自动补0进行计算,另一种是js数组中取不存在下标的值会返回undefined利用这一性质
只要需要的值取出来为undefined,我么就可以理解为要求的值是首尾,只需要三元表达式处理一下就ok

时间复杂度:O(n^2)
空间复杂度:O(n^2)

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function (numRows) {
    if (!numRows) return [];
    var list = [
        [1]
    ]
    for (let i = 1; i < numRows; i++) {
        list.push([]);
        for (let j = 0; j < i + 1; j++) {
            list[i].push((list[i - 1][j - 1] ? list[i - 1][j - 1] : 0) + (list[i - 1][j] ? list[i - 1][j] : 0))
        }
    }
    return list;
};

119. 杨辉三角2

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

杨辉三角

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

示例:

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

进阶:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这道题和杨辉三角不一样的地方在于返回指定索引层数,而且空间复杂度需要优化。
首先将第一层预先定义好
然后根据参数循环,因为给的是索引而且我们定义了第一层。所以循环索引次即可定位到需要的那一层。
每次开始内部循环之前要给list前补0。
这有两个目的:1.为了方便下一层计算 2.保证上一层和下一层长度一致,方便处理末尾
内部循环的主要任务就是根据上一层来计算下一层,也就是 list[j] = list[j] + list[j + 1];
有一个地方需要注意就是 for (let j = 0; j < i + 1; j++) 内部循环的条件j < i + 1
这一步保证了新的一层计算是只计算到倒数第二位,剩下的最后一位1自动保留下来了。

/**
 * @param {number} rowIndex
 * @return {number[]}
 */
var getRow = function (rowIndex) {
    var list = [1];
    for (let i = 0; i < rowIndex; i++) {
        list.unshift(0);
        for (let j = 0; j < i + 1; j++) {
            list[j] = list[j] + list[j + 1];
        }
    }
    return list;
};

关于119题其实我还有一个思路
因为杨辉三角不是对称的么,我们可以只计算一半然后翻转,就得到完整的结果。
这个思路有时间再写吧。偷个懒