这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
91. 杨辉三角 (pascals-triangle)
标签
- 数学
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
基本思路
- 先初始化,元素全部置为 1
- 下一行就是上一行的 对应元素加和,找关系算就行了
- 保存数组,推入结果,没啥好说简单题。
写法实现
var generate = function(numRows) {
let res = []
for (let i = 0; i < numRows; i++) {
let curArr = new Array(i + 1).fill(1)
for (j = 1; j < curArr.length - 1; j++) {
curArr[j] = res[i - 1][j - 1] + res[i - 1][j]
}
res.push(curArr)
}
return res
};
console.log(generate(5))
92. 三角形最小路径和 (pascals-triangle-ii)
标签
- dp
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
示例
输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
2
3 4
6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
基本思想
我们思考,从上到下和从下到上的最小路径其实是一样的。
还有像这种二维数组找路径的,第一个想到 dp 会比较方便。
对动态规划基本概念不熟悉请移步 DP 基础
基本步骤
我们还是从这三个角度去看问题
- 寻找最优子结构(状态表示)
- 归纳状态转移方程(状态计算)
- 边界初始化
- 状态表示
dp[i][j]表示从点(i, j)到底边的最小路径和。
- 状态转移方程
- 与
(i, j)点相邻的结点为(i + 1, j)和(i + 1, j + 1), 所以只有2条路可走,既然求的是最短,那么选取最小值,再加上本身节点值。 dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]
- 与
- 边界条件
- 遍历到顶
i >= 0就行,注意从倒数第二行开始从下往上遍历。从最后一行遍历triangle[i + 1]就溢出了
- 遍历到顶
写法实现
var minimumTotal = function(triangle) {
// 特判
if (triangle.length === 1) {
return triangle[0][0]
}
// 这地方为什么是 i = triangle.length - 2,
// 因为是从倒数第二行开始遍历,否则下面 triangle[i + 1]就溢出
for (let i = triangle.length - 2; i >= 0; i--) {
for (let j = 0; j <= i; j++) {
// 可不用单独声明,直接原地修改
triangle[i][j] += Math.min(
triangle[i + 1][j],
triangle[i + 1][j + 1]
)
}
}
return triangle[0][0]
};
let triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
console.log(minimumTotal(triangle))
另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧