30 天刷题挑战(十六)

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

841. 钥匙和房间

思路

广度优先算法,使用一个 Set 记录访问过的房间,使用队列 queue 先进先出的特性依次遍历每一个房间,最后判断 Set 的大小是否等于房间数。

代码

js 复制代码
/**
 * @param {number[][]} rooms
 * @return {boolean}
 */
var canVisitAllRooms = function(rooms) {
  const visited = new Set()
  const queue = []

  queue.push(0)
  visited.add(0)

  while(queue.length) {
    let nextRooms = rooms[queue.shift()]
   
    for(let i = 0; i < nextRooms.length; i++) {
      const r = nextRooms[i]

      if (!visited.has(r)) {
        queue.push(r)
        visited.add(r)
      }
    }
  }

  return visited.size === rooms.length
};

547. 省份数量

思路

广度优先算法,使用一个 Set 记录没被访问的城市,每个城市都能被访问的时候省份加一。

代码

ini 复制代码
/**
 * @param {string[][]} equations
 * @param {number[]} values
 * @param {string[][]} queries
 * @return {number[]}
 */
var calcEquation = function(equations, values, queries) {
  const map = new Map()     // 存储顶点和它的边
  const visited = new Map() // 缓存
  const res = []

  const dfs = (src ,dst) => {
    if (src === dst) {
      return 1.0
    }

    let adjs = map.get(src)

    for (let i = 0; i < adjs.length; i++) {
      let next = adjs[i]

      if (!visited.get(next[0])) {
        visited.set(next[0], true)

        let ret = dfs(next[0], dst)

        visited.set(next[0], false)

        if (ret !== -1.0) {
          return next[1] *ret
        }
      }
    }

    return -1.0
  }
  

  for (let i = 0; i < equations.length; ++i) {
    let e = equations[i]
    let v = values[i]
   
    if (!map.has(e[0])) {
      map.set(e[0], [])
      visited.set(e[0], false)
    }

    if (!map.has(e[1])) {
      map.set(e[1], [])
      visited.set(e[1], false)
    }

    let adj1 = map.get(e[0])
    let adj2 = map.get(e[1])
    adj1.push([e[1], v])
    adj2.push([e[0],  1 / v])
  }

  for (let q of queries) {
    let n0 = q[0]
    let n1 = q[1]

     if (map.has(n0) && map.has(n1)) {
       visited.set(n0, true)
       res.push(dfs(n0, n1))
       visited.set(n0, false)
     } else {
       res.push(-1.0)
     }
  }

 return res
};

本文完,感谢阅读。

相关推荐
freewlt2 小时前
前端性能优化实战:从 Lighthouse 分数到用户体验的全面升级
前端·性能优化·ux
小小亮012 小时前
Next.js基础
开发语言·前端·javascript
华洛2 小时前
我用AI做了一个48秒的真人精品漫剧,不难也不贵
前端·javascript·后端
Novlan13 小时前
我把 Claude Code 里的隐藏彩蛋提取出来了——零依赖的 ASCII 虚拟宠物系统
前端
米粒13 小时前
力扣算法刷题 Day 27
算法·leetcode·职场和发展
IAUTOMOBILE3 小时前
Python 流程控制与函数定义:从调试现场到工程实践
java·前端·python
好大哥呀4 小时前
C++ Web 编程
开发语言·前端·c++
Fuxiao___4 小时前
C 语言核心知识点讲义(循环 + 函数篇)
算法·c#
ShineWinsu4 小时前
对于Linux:进程优先级、进程切换以及进程调度的解析
linux·面试·笔试·进程·进程切换·进程调度·进程优先级
漫随流水4 小时前
c++编程:反转字符串(leetcode344)
数据结构·c++·算法