最终还是没有逃过杨辉三角,哈哈哈哈
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题其实我还有一个思路
因为杨辉三角不是对称的么,我们可以只计算一半然后翻转,就得到完整的结果。
这个思路有时间再写吧。偷个懒
0 条评论