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
};

本文完,感谢阅读

相关推荐
oMcLin4 分钟前
如何在 CentOS 7 上通过配置和调优 OpenResty,提升高并发 Web 应用的 API 请求处理能力?
前端·centos·openresty
IT_陈寒5 分钟前
Java开发者必知的5个性能优化技巧,让应用速度提升300%!
前端·人工智能·后端
橘颂TA7 分钟前
【剑斩OFFER】算法的暴力美学——leetcode 429 题:N 叉树的层序遍历
算法
"YOUDIG"8 分钟前
信稿笺纸设计工具:传统排版美学与数字化设计的高效融合
科技·考研·算法·面试·职场和发展·高考
程序员-King.9 分钟前
day126—二分查找—寻找旋转排序数组中的最小值(LeetCode-153)
算法·leetcode·二分查找
菜鸟233号9 分钟前
力扣494 目标和 java实现
java·数据结构·算法·leetcode
有一个好名字9 分钟前
力扣-字符串解码
java·算法·leetcode
小二·12 分钟前
Python Web 开发进阶实战:前端现代化 —— Vue 3 + TypeScript 重构 Layui 界面,打造高性能 SPA
前端·python·typescript
sali-tec13 分钟前
C# 基于OpenCv的视觉工作流-章9-均值滤波
人工智能·opencv·算法·计算机视觉·均值算法