30 天刷题挑战(十七)

题目来源: LeetCode 75 30 天 JavaScript 挑战

1926. 迷宫中离入口最近的出口

思路

广度优先算法,初始化第一步位置,每一步可以走上下左右,记录走过的位置,最后能到达迷宫边界就返回对应步数,否则返回 -1。

代码

js 复制代码
/**
 * @param {character[][]} maze
 * @param {number[]} entrance
 * @return {number}
 */
const nearestExit = function(maze, entrance) {
  const walkableArr = [[...entrance, 0]]
  const pos = [
    {x: -1, y: 0},
    {x: 1, y: 0},
    {x: 0, y: -1},
    {x: 0, y: 1},
  ]

   while(walkableArr.length) {
     const [row, col, step] = walkableArr.shift()
     
     // 尝试上下左右行走
     for(let i = 0; i < pos.length; i++) {
       const {x, y} = pos[i]
       const nextX = row + x
       const nextY = col + y
       const nextRow = maze[nextX]

       if (nextRow) {
         if (nextRow[nextY] === '.') {
            // 到达边迷宫界,找到出口
            if (nextX === 0 || nextX === maze.length - 1 || nextY === 0 || nextY === maze[nextX].length - 1) {
              return step + 1
            }
            // 记录走过的地方
            maze[nextX][nextY] = '+'
            // 往下一个格子走
            walkableArr.push([nextX, nextY, step + 1])
         }
       }
     }
     // 记录走过的地方
     maze[row][col] = '+'
   }

   return -1
};

994. 腐烂的橘子

思路

广度优先遍历,统计好橘子的个数,使用一个队列保存坏橘子的坐标;遍历坏橘子队列,将坏橘子逐一出列,在它的 4 个方向腐化好橘子,最后返回使用时间或者 -1 表示无法完全腐化;

代码

js 复制代码
/**
 * @param {number[][]} grid
 * @return {number}
 */
const orangesRotting = function(grid) {
  let unrotten = 0
  const queue = []
  const height = grid.length
  const width = grid[0].length
 
 // 遍历网格
  for (let i = 0; i < height; i++) {
    for(let j = 0; j < width; j++) {
      if (grid[i][j] === 2) {
        // 所有的坏橘子的坐标推入队列
        queue.push([i, j])
      } else if (grid[i][j] === 1) {
        // 统计好橘子的个数
        unrotten++
      }
    }
  }

  if (unrotten === 0) {
    return 0
  }

  // 腐化用时
  let level = 0
  // 4 个方向
  const pos = [
    {x: -1, y: 0},
    {x: 1, y: 0},
    {x: 0, y: -1},
    {x: 0, y: 1},
  ]

  // 遍历坏橘子队列
  while(queue.length) {
    // 时间加一
    level++

    let levelSize = queue.length

    for(let i = 0; i < levelSize; i++) {
     // 坏橘子出列
      let current = queue.shift()
      
      // 尝试 4 个方向
      for(let j = 0; j < pos.length; j++) {
        let p = pos[j]
        let x = current[0] + p.x
        let y = current[1] + p.y

        // 跳过超出边界或本身就不好的橘子
        if (x < 0 || x >= height || y < 0 || y >= width || grid[x][y] !== 1 ) {
          continue
        }
        // 腐化好橘子
        grid[x][y] = 2
        queue.push([x, y])
        unrotten--
      }
    }
  }

  // 返回用时或者 -1
  return unrotten === 0 ? level - 1 : -1
};

本文完,感谢阅读

相关推荐
前端大卫41 分钟前
为什么 React 中的 key 不能用索引?
前端
DashVector41 分钟前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
AI纪元故事会42 分钟前
【计算机视觉目标检测算法对比:R-CNN、YOLO与SSD全面解析】
人工智能·算法·目标检测·计算机视觉
你的人类朋友43 分钟前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
夏鹏今天学习了吗1 小时前
【LeetCode热题100(59/100)】分割回文串
算法·leetcode·深度优先
卡提西亚1 小时前
C++笔记-10-循环语句
c++·笔记·算法
还是码字踏实1 小时前
基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
数据结构·算法·leetcode·双指针·对撞指针
小李小李不讲道理3 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻3 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
Coovally AI模型快速验证3 小时前
当视觉语言模型接收到相互矛盾的信息时,它会相信哪个信号?
人工智能·深度学习·算法·机器学习·目标跟踪·语言模型