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

本文完,感谢阅读。

相关推荐
linweidong1 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
leobertlan4 小时前
2025年终总结
前端·后端·程序员
子兮曰5 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
百锦再5 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君6 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再6 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI6 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
颜酱7 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919107 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878387 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab