【JavaScript】LeetCode:61-65

文章目录

  • 61 课程表
  • 62 实现Trie(前缀树)
  • 63 全排列
  • 64 子集
  • 65 电话号码的字母组合

61 课程表

在这里插入图片描述

  • Map + BFS
  • 拓扑排序:将有向无环图转为线性顺序。
  • 遍历prerequisites:1. 数组记录每个节点的入度,2. 哈希表记录依赖关系。
  • n = 6,prerequisites = [ [3,0],[3,1],[4,1],[4,2],[5,3],[5,4] ]。
    0、1、2的入度为0,3、4、5的入度为2。
    map:0:[3],1:[3,4],2:[4],3:[5],4:[5]。
  • 创建队列,将入度为0的节点入队。
  • 陆续将入度为0的节点从队列中弹出,直至队列为空。入度为0的节点不需要学习先修课程,所以可以直接选。
  • 每弹出一个节点,就将该节点对应后续课程的入度 - 1,并将入度为0的节点加入队列。
  • count记录选课的数量,每弹出一个节点,count++,最后判断count是否等于总课数。
/*** @param {number} numCourses* @param {number[][]} prerequisites* @return {boolean}*/
var canFinish = function(numCourses, prerequisites) {let pre = new Array(numCourses).fill(0);let map = new Map();for(let i = 0; i < prerequisites.length; i++){pre[prerequisites[i][0]] += 1;if(!map.has(prerequisites[i][1])){map.set(prerequisites[i][1], [prerequisites[i][0]]);}else{map.get(prerequisites[i][1]).push(prerequisites[i][0]);}}let queue = [];let count = 0;for(let j = 0; j < numCourses; j++){if(pre[j] == 0){queue.push(j);}}while(queue.length != 0){let item = queue.shift();count += 1;let cls = map.get(item);if(cls != undefined){for(let k = 0; k < cls.length; k++){pre[cls[k]] -= 1;if(pre[cls[k]] == 0){queue.push(cls[k]);}}}}return count == numCourses;
};

62 实现Trie(前缀树)

在这里插入图片描述

  • 前缀树,又称字典树、单词查找树。

  • isEnd:记录该节点是否为最后一个节点(单词的结尾)。

  • Trie:保存了当前节点(字母)的下一个出现的所有字符。

  • 例如:sea,sels,she组成的前缀树如下所示。

  •         s

  •     /       \

  •   e          h

  •  /   \          \

  • a     l          e

  •        |

  •        s

  • 插入:向Trie中插入一个单词。
    从根结点开始与单词的第一个字符进行匹配,一直匹配到前缀链上没有对应的字符,这时开始不断开辟新的结点,直到插入完单词的最后一个字符,并将最后一个结点isEnd = true,表示它是一个单词的末尾。

  • 查找:查找Trie中是否存在单词word。
    从根结点开始一直向下匹配,如果前缀链上没有对应的字符就返回false,如果直到最后一个字符都匹配,则返回所匹配最后一个节点的isEnd。

  • 前缀匹配:判断Trie中是否有以prefix为前缀的单词。
    和查找类似,只是不需要判断最后一个字符结点的isEnd,因为既然能匹配到最后一个字符,就一定有单词以prefix为前缀。

var Trie = function() {this.children = {};this.isEnd = false;
};/** * @param {string} word* @return {void}*/
Trie.prototype.insert = function(word) {let trie = this.children;for(let i of word){if(trie[i] == null){trie[i] = new Trie();}trie = trie[i];}trie.isEnd = true;
};/** * @param {string} word* @return {boolean}*/
Trie.prototype.search = function(word) {let trie = this.children;for(let i of word){if(trie[i] == null){return false}trie = trie[i];}return trie.isEnd;
};/** * @param {string} prefix* @return {boolean}*/
Trie.prototype.startsWith = function(prefix) {let trie = this.children;for(let i of prefix){if(trie[i] == null){return false}trie = trie[i];}return true;
};/*** Your Trie object will be instantiated and called as such:* var obj = new Trie()* obj.insert(word)* var param_2 = obj.search(word)* var param_3 = obj.startsWith(prefix)*/

63 全排列

在这里插入图片描述

  • 递归
  • 设置used数组,标记已经选择的元素。
  • for循环横向遍历,递归纵向遍历。
  • 递归出口:收集元素的数组path的length = 数组nums的length,此时到达叶子节点,找到了一个全排列,收集路径path。
  • 注意:在结果数组res中放路径时,应使用 path .slice(),因为如果使用path,后续path的改变会影响存放在res的path。
/*** @param {number[]} nums* @return {number[][]}*/
var permute = function(nums) {var traversal = function(nums, used){if(path.length == nums.length){res.push(path.slice());return;}for(let i = 0; i < nums.length; i++){if(used[i] == 0){path.push(nums[i]);used[i] = 1;traversal(nums, used);path.pop();used[i] = 0;}}}let used = Array(nums.length).fill(0);let path = [];let res = [];traversal(nums, used);return res;
};

64 子集

在这里插入图片描述

  • 递归
  • 设置startIndex,标记遍历开始的位置。
  • for循环横向遍历,递归纵向遍历。
  • 子集与全排列不同,需要记录所有的节点,而不只是叶子节点。
  • 每次进入递归都要收集子集。
  • 递归出口:startIndex > nums的length,此时没有元素可取了。
/*** @param {number[]} nums* @return {number[][]}*/
var subsets = function(nums) {var traversal = function(nums, startIndex){res.push(path.slice());if(startIndex == nums.length){return;}for(let i = startIndex; i < nums.length; i++){path.push(nums[i]);traversal(nums, i + 1);path.pop();}}let res = [];let path = [];traversal(nums, 0);return res;
};

65 电话号码的字母组合

在这里插入图片描述

  • 递归
  • 定义map数组映射数字和字母。
  • for循环横向遍历,字母的个数为for循环的遍历次数;递归纵向遍历,digits的长度为递归深度。
  • 设置index,记录遍历到digits的第几个数字了。
  • 递归出口:index = digits的length,此时到达叶子节点,收集结果。
/*** @param {string} digits* @return {string[]}*/
var letterCombinations = function(digits) {var traversal = function(digits, index){if(index == digits.length){res.push(path.slice().join(""))return;}let all = map[digits[index] - '0'];for(let item of all){path.push(item);traversal(digits, index + 1);path.pop();}}let map = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];let path = [];let res = [];if(digits.length == 0){return res;}traversal(digits, 0);return res;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1562246.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度学习的细粒度图像分析综述【翻译】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 基础信息0 摘要1 INTRODUCTION2 识别与检索 RECOGNITION VS. RETRIEVAL3 问题和…

牛客SQL练习详解 06:综合练习

牛客SQL练习详解 06&#xff1a;综合练习 SQL34 统计复旦用户8月练题情况SQL35 浙大不同难度题目的正确率SQL39 21年8月份练题总数 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; SQL34 统…

Python100道新手练习题(附答案)

基础语法 1.打印 “Hello, World!” print("Hello, World!")2.定义一个变量并打印其值 message "Hello, Python!" print(message)3.定义两个整数变量并计算它们的和 a 5 b 3 sum a b print(sum)4.使用条件语句判断一个数是否为正数 num 10 if n…

初知C++:AVL树

文章目录 初知C&#xff1a;AVL树1.AVL树的概念2.AVL树的是实现2.1.AVL树的结构2.2.AVL树的插入2.3.旋转2.4.AVL树的查找2.5.AVL树平衡检测 初知C&#xff1a;AVL树 1.AVL树的概念 • AVL树是最先发明的自平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性…

node.js服务器基础

node.js的事件循环 node.js是基于事件驱动的&#xff0c;通常在代码中注册想要等待的事件&#xff0c;设定好回调函数&#xff0c;当事件触发的时候就会调用回调函数。如果node.js没有要处理的事件了&#xff0c;那整个就结束了;事件里面可以继续插入事件&#xff0c;如果有事…

低代码开发技术:驱动MES系统创新与制造业数字化转型的融合之路

低代码开发与生产管理MES系统的融合&#xff0c;是当今制造业数字化转型的一个重要趋势。以下是对这一融合现象的详细分析&#xff1a; 一、低代码开发的概念与特点 低代码开发是一种通过图形化界面和预构建模块来简化应用程序开发过程的方法。它允许开发人员使用拖放组件和最…

接口多继承与子类继承多接口时的冲突问题,方法冲突与变量冲突.....

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

JavaScript 第7章:字符串处理

第7章&#xff1a;字符串处理 在 JavaScript 中&#xff0c;字符串是一个非常常用的数据类型&#xff0c;用于表示文本信息。JavaScript 提供了许多内置的方法来处理字符串&#xff0c;包括操作、搜索、替换和格式化等。 一、字符串操作方法 1. charAt charAt(index) 方法返…

支票欺诈检测AI系统

这是我们 LLM Makerspace 活动的记录摘要&#xff0c;我们使用经过微调的 LLM 构建了一个支票欺诈检测和解释 AI 系统。 那么&#xff0c;支票到底是什么&#xff1f;它们本质上是一种汇款&#xff0c;你将金额写在一张纸上并将其交给某人。它被视为法定货币和服务付款。作为一…

光明乳业乳品四厂勇闯TPM世界级奖终审,开创中国乳品行业新纪元

近日&#xff0c;中国乳品行业的标志性事件在光明乳业乳品四厂隆重上演&#xff0c;该厂迎来了TPM&#xff08;全面生产维护&#xff09;世界级奖项的终审评审&#xff0c;这不仅是光明乳业发展历程中的重大突破&#xff0c;也是中国乳品行业首次冲击该领域最高荣誉——TPM世界…

华为面试就这?00后直接拿下20K的offer...

先说一下我的情况&#xff0c;某不知名211本计算机毕业&#xff0c;之前在深圳那边做了大约半年多少儿编程老师&#xff0c;之后内部平调回长沙这边&#xff0c;回来之后发现有点难&#xff0c;这边可能是业绩难做&#xff0c;虚假承诺很厉害&#xff0c;要给那些家长虚假承诺去…

mac 桌面版docker no space left on device

报错信息 docker pull镜像时报&#xff1a; failed to register layer: Error processing tar file(exit status 1): write /home/admin/oceanbase_bak/bin/observer: no space left on device 解决 增加 docker 虚拟磁盘大小。 调整完点击重启即可。

Etsy店铺总是被封?看看这些替代平台!

对于创意商家而言&#xff0c;Etsy是一个充满机遇的电商平台。然而&#xff0c;Etsy平台政策过于苛刻&#xff0c;许多卖家的店铺频繁遭遇封禁&#xff0c;辛苦建立的客户基础瞬间化为乌有。本文将为您介绍几个值得一试的Etsy替代平台&#xff0c;帮助您分散经营风险&#xff0…

匹配全国地址的正则表达式工具类

正则表达式&#xff0c;匹配全国五级地址工具类&#xff0c;可以直接放在项目中使用~ 1级&#xff1a;国 &#xff08;可忽略不填&#xff09; 2级&#xff1a;**省、**自治区、**直辖市、**特别行政区、&#xff08;四个直辖市可忽略不填&#xff09; 3级&#xff1a;**市、**…

pytest + yaml 框架 - 支持pytest-repeat插件重复执行用例

平常在做功能测试的时候&#xff0c;经常会遇到某个模块不稳定&#xff0c;偶然会出现一些bug&#xff0c;对于这种问题我们会针对此用例反复执行多次&#xff0c;最终复现出问题来。 自动化运行用例时候&#xff0c;也会出现偶然的bug&#xff0c;可以针对单个用例&#xff0…

新特性速览! Sermant 2.1.0版本重磅发布

9月底&#xff0c;Sermant社区正式发布了2.1.0 Release版本&#xff0c;本次版本更新为大家带来了许多新的重要特性。在此前版本xDS协议支持的基础上&#xff0c;2.1.0版本新增了路由和负载均衡的CRD的支持&#xff0c;同时路由插件也适配了当前的xDS协议。此外新增了RocketMQ灰…

注册电气工程师印章要求

一、边框 1.尺寸&#xff1a;长63mm、宽28mm、线宽&#xff1a;0.6mm 2.第一格&#xff1a;宽7.25mm 3.第二格&#xff1a;宽19.2mm 二、文字 1.第一行 名称&#xff1a;行长59.50mm 字高5.61mm 字体 宋体 2.第二行 姓名&#xff1a;行长42.00mm 字高5.28mm 字体 姓名 宋体 人名…

超声波清洗机靠谱吗?适合学生党入手的四款眼镜清洗机品牌推荐!

有没有学生党还不知道双十一买什么&#xff1f;其实可以去看看超声波清洗机&#xff0c;说实话它的实用性真的很高&#xff0c;对于日常用于清洗眼镜真的非常合适&#xff0c;不仅可以帮助大家节约时间而且还能把眼镜清洗的干净透亮&#xff0c;接下来我就来为大家带来四款好用…

【光通信接口】了解差异: SFP28 与 SFP+ 收发器

原文链接 https://www.fibermall.com/blog/sfp28-vs-sfp-plus.htm 目录 导引 1. 什么是 sfp28 收发器&#xff1f;1.1 sfp28 收发器的定义1.2 sfp28 与 sfp 相比有何优势&#xff1f;1.3 sfp28 的优势 2. sfp28 与 sfp 相比有何优势&#xff1f;2.1 sfp28 背后的技术2.2 数据速…

WordPress添加meta标签做seo优化

一、使用function.php文件添加钩子函数添加 方法1、使用is_page()判断不同页面的page_id进行辨别添加不同页面keyword和description &#xff08;1&#xff09;通过页面前台源码查看对应页面的id &#xff08;2&#xff09;或者通过wordpress后台&#xff0c;点击页面列表&…