当前位置: 首页 > news >正文

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

相关文章:

【JavaScript】LeetCode:61-65

文章目录 61 课程表62 实现Trie&#xff08;前缀树&#xff09;63 全排列64 子集65 电话号码的字母组合 61 课程表 Map BFS拓扑排序&#xff1a;将有向无环图转为线性顺序。遍历prerequisites&#xff1a;1. 数组记录每个节点的入度&#xff0c;2. 哈希表记录依赖关系。n 6&a…...

【SpringAI】(一)从实际场景入门大模型——适合Java宝宝的大模型应用开发

一、简单场景介绍 假设你需要为一个商城项目接入一个基于SpringAI的智能客服系统&#xff0c;现在我们来基本模拟一下&#xff1a; 当我通过系统提问&#xff0c;大模型会针对我的问题进行回答。 当我们通过程序提问时&#xff0c;SpringAI会将我们的提问封装成Prompts&#x…...

植物大战僵尸杂交版

最新版植物大战僵尸杂交版 最近本款游戏火爆 下载资源如下&#xff1a; win版本&#xff1a;2.3.7 链接&#xff1a;下载地址 提取码&#xff1a;9N3P Mac&#xff08;苹果版本&#xff09;&#xff1a;2.0.0 链接&#xff1a;下载地址 提取码&#xff1a;Bjaa 介绍&#xff…...

live2d 实时虚拟数字人形象页面显示,对接大模型

live2dSpeek 测试不用gpu可以正常运行 https://github.com/lyz1810/live2dSpeek 运行的话还需要额外下载https://github.com/lyz1810/edge-tts支持语音 ## 运行live2dSpeek >npm install -g http-server >http-server . ## 运行edge-tts python edge-tts.py...

SpringCloud-持久层框架MyBatis Plus的使用与原理详解

在现代微服务架构中&#xff0c;SpringCloud 是一个非常流行的解决方案。而在数据库操作层面&#xff0c;MyBatis Plus 作为 MyBatis 的增强工具&#xff0c;能够简化开发&#xff0c;提升效率&#xff0c;特别是在开发企业级应用和分布式系统时尤为有用。本文将详细介绍 MyBat…...

Servlet的HttpServletRequest

HttpServletRequest是Java Servlet规范中定义的一个接口&#xff0c;它表示客户端向服务器发送的请求&#xff0c;并提供了与HTTP请求相关的方法和属性。 getSession方法()&#xff1a;用于获取与当前请求相关联的HttpSession对象。 setAttribute(String name, Object value)…...

U9销售订单不能带出最新价格出来

业务员突然说系统带不出来销售价格。了解之后&#xff0c;不是带不出来价格&#xff0c;是做了价格调整之后&#xff0c;最新价格没有匹配出来&#xff0c;带出来的价格是历史价格。检查&#xff0c;分析相关的单据&#xff0c;生效日期&#xff0c;失效日期&#xff0c;审核状…...

Jmeter接口测试企业级项目实战day1

1.接口测试 接口测试工具&#xff1a; JMeter&#xff1a;支持多种接口类型&#xff0c;还能测试性能&#xff0c;开源&#xff0c;开源进行二次扩展。 Postman&#xff1a;简单&#xff0c;方便&#xff0c;局限性比较大&#xff0c;适合开发临时行调试 APIFox等&#xff1a;新…...

接口测试面试题含答案

1、解释一下正向和逆向测试。 正向测试&#xff1a;针对接口设计预期的功能和行为&#xff0c;验证接口是否按照预期工作。 逆向测试&#xff1a;针对错误输入、不合理的条件或非预期的使用方式&#xff0c;验证接口是否能够适当地处理这些情况并提供合理的错误处理。 2、什…...

横板营业执照提取生成

前言 有一段时间没发博客了&#xff0c;今天分享下几个月前做的营业执照提取器UI 预览图 框架 b-ui很好用&#xff0c;这个前端框架作者 发布的插件我都会用&#xff0c;鱿鱼助手也是基于这个框架开发的 代码 html <template><view><template><view…...

webm格式怎么转换成mp4?这5种转换方法很好用

现如今&#xff0c;视频格式繁多&#xff0c;而webm作为一种由谷歌开发的视频格式&#xff0c;以其高画质和低带宽需求著称。然而&#xff0c;并非所有设备和播放器都完美支持webm格式&#xff0c;这时将其转换为兼容性更强的MP4格式就显得尤为重要。下面给大家分享5种非常简单…...

C/C++语言基础--C++异常看这一篇就够了

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 通过前面几节课&#xff0c;我们学习了抽象、封装、继承、多态等相关的概念&#xff0c;接下来我们将讲解异常&#xff0c;异常是专门处理错误的&#xff1b;这一次加了不少图标&#xff0c;希望大家喜欢;C语…...

DFT ATPG中常见影响coverage的因素有哪些?

# DFT ATPG中常见影响Coverage的因素 ## 一、电路结构复杂性 1. **逻辑层次深度** - **原理** - 当电路的逻辑层次很深时,信号在传播过程中会经过多个逻辑门的处理。这使得测试向量难以准确地控制和观察内部节点的状态。例如,在一个具有多层嵌套逻辑的电路中,如一个…...

Python机器学习数据清洗到特征工程策略

Python机器学习数据清洗到特征工程策略 目录 ✨ 数据清洗&#xff1a;处理缺失值与异常值的策略&#x1f504; 特征选择&#xff1a;筛选与数据目标高度相关的特征&#x1f6e0; 特征工程&#xff1a;数据转换与生成新特征的多样化方法&#x1f4ca; 类别型变量的数值化&…...

多线程-进阶(2)CountDownLatchConcurrentHashMapSemaphore

目的; JUC(java.util.concurrent) 的常⻅类 接着上一节课到 1.信号量 Semaphore 信号量, ⽤来表⽰ "可⽤资源的个数". 本质上就是⼀个计数器。 理解信号量 可以把信号量想象成是停⻋场的展⽰牌: 当前有⻋位 100 个. 表⽰有 100 个可⽤资源. 当有⻋开进去的时候,…...

密码管理器KeePass的安装及使用

文章目录 软件下载安装汉化新建数据库创建\移动\修改 群组添加/修改/删除/移动 记录展示、搜索、锁定单独使用keepass生成密码的功能AES-256的密钥长度为256位&#xff0c;为啥可以设置超过32个字符的密钥&#xff1f; 软件下载 安装 分别解压&#xff1a;KeePass-2.53.1.zip&…...

星海智算:【萤火遛AI-Stable-Diffusion】无需部署一键启动

部署流程 1、注册算力云平台&#xff1a;星海智算 https://gpu.spacehpc.com/ 2、创建实例&#xff0c;镜像请依次点击&#xff1a;“镜像市场”->“更换”->“AI绘画”->“萤火遛AI-Stable Diffusion”。 程序首次启动可能需要几分钟&#xff0c;待实例显示“运行…...

JS生成器的特殊用法:委托yield*

yield 的基本用法 yield 用于在生成器函数中暂停函数执行&#xff0c;并返回一个值给外部调用者。当生成器再次被调用时&#xff0c;会从暂停的地方继续执行。 示例&#xff1a; function* simpleGenerator() {yield 1;yield 2;yield 3; }const gen simpleGenerator();cons…...

【CuPy报错】NVRTC_ERROR_COMPILATION (6)找不到 ‘vector_types.h‘

cupy安装不要再使用pip install cupy了&#xff0c; 已经替换成基于版本安装了pip install cupy-cuda12x&#xff0c;详见cupy官网。 安装完成后&#xff0c;在import cupy之后报错&#xff0c;找不到 ‘vector_types.h’: CompileException: /home/zoe/venv/lib/python3.10/…...

机器学习:知识蒸馏(Knowledge Distillation,KD)

知识蒸馏&#xff08;Knowledge Distillation&#xff0c;KD&#xff09;作为深度学习领域中的一种模型压缩技术&#xff0c;主要用于将大规模、复杂的神经网络模型&#xff08;即教师模型&#xff09;压缩为较小的、轻量化的模型&#xff08;即学生模型&#xff09;。在实际应…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...