前端算法面试必刷题系列[48]

222 阅读2分钟

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

91. 杨辉三角 (pascals-triangle)

标签

  • 数学
  • 简单

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

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

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

示例:

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

基本思路

  1. 先初始化,元素全部置为 1
  2. 下一行就是上一行的 对应元素加和,找关系算就行了
  3. 保存数组,推入结果,没啥好说简单题。

写法实现

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 传送门

这里不贴题了,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 基础

基本步骤

我们还是从这三个角度去看问题

  1. 寻找最优子结构(状态表示)
  2. 归纳状态转移方程(状态计算)
  3. 边界初始化
  • 状态表示
    • 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,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧

参考