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

【JavaScript】LeetCode:41-45

文章目录

  • 41 排序链表
  • 42 合并k个升序链表
  • 43 LRU缓存
  • 44 二叉树的中序遍历
  • 45 二叉树的最大深度

41 排序链表

在这里插入图片描述

  • 递归 + 归并排序
  • 找到链表中心点,从中心点将链表一分为二。奇数个节点找中心点,偶数个节点找中心左边的点作为中心点。
  • 快慢指针找中心点,当快指针移动到该段链表的最后一个元素时,慢指针所指向的节点为中心点。
  • 找到中心点后,中心点.next = null,将链表从中间断开。分别将前一半链表的头节点(head)和后一半链表的头节点(中心点.next)进行下一次划分。
  • 注意:快慢指针初始化时,快指针比慢指针快一步,方便链表只有2个节点时划分链表。
  • 合并有序链表:
    (1) 建立新节点作为新链表的哨兵节点。
    (2) left,right 分别指向两个链表的头部,比较两个指针处节点值的大小,从小到大插入到有序链表中,指针交替前进,直至其中一个链表为空。将剩余的链表直接插入到有序链表的尾部。
    (3) 返回哨兵节点.next。
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @return {ListNode}*/
var sortList = function(head) {if(head == null || head.next == null){ // 1个节点或0个节点return head;}let slow = head, fast = head.next;while(fast != null && fast.next != null){ // 奇数个节点fast = null停止,偶数个节点fast.next = null停止slow = slow.next;fast = fast.next.next;}let tmp = slow.next;slow.next = null;let left = sortList(head);let right = sortList(tmp);let dummy = new ListNode();let res = dummy;while(left != null && right != null){if(left.val < right.val){dummy.next = left;left = left.next;}else{dummy.next = right;right = right.next;}dummy = dummy.next;} dummy.next = left? left: right;return res.next; 
};

42 合并k个升序链表

在这里插入图片描述

  • 方法1:最小堆。将头节点放入堆中,弹出最小值node,此时将node.next放入堆中,一直取到堆为空为止,每次取出最小值时,都将最小值的下一个节点放入堆中。
  • 方法2:分治。这里给出该方法的代码。
  • 将链表数组lists一分为二,先合并前一半链表,再合并后一半链表,最后完成全部链表的合并。
  • 中心点为mid,前一半链表的区域为[左,mid],后一半链表的区域为[mid + 1,右]。
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/var merge = function(left, right){let dummy = new ListNode();let cur = dummy;while(left != null && right != null){if(left.val < right.val){cur.next = left;left = left.next;}else{cur.next = right;right = right.next;}cur = cur.next;}cur.next = left? left: right;return dummy.next;
}/*** @param {ListNode[]} lists* @return {ListNode}*/
var mergeKLists = function(lists) {function partition(i, j){if(i == j){ // 区域内只有1个值return lists[i];}if(i > j){ // 非法区域return null;}let mid = Math.floor((i + j) / 2);let left = partition(i, mid);let right = partition(mid + 1, j);return merge(left, right);}return partition(0, lists.length - 1)
};

43 LRU缓存

在这里插入图片描述

  • 哈希表 + 双向链表
  • put:
    ① key不存在:创建新节点,添加进哈希表,添加到链表头部。如果当前容量 > capacity,删除链表尾部节点,删除哈希表中对应的项。
    ② key存在:通过哈希表找到key所在的节点,改变value,移动到链表头部。
  • get:
    ① key不存在:返回 -1。
    ② key存在:通过哈希表找到key所在的节点,移动到链表头部,返回value。
  • 这里给出的代码直接使用哈希表实现各类操作。
  • this.map.delete(key); this.map.set(key, value);:先删除,再将该节点添加到最后。
  • this.map.keys().next().value;:哈希表中第一个键值。
/*** @param {number} capacity*/
var LRUCache = function(capacity) {this.capacity = capacity;this.map = new Map();
};/** * @param {number} key* @return {number}*/
LRUCache.prototype.get = function(key) {if(this.map.has(key)){let value = this.map.get(key);this.map.delete(key);this.map.set(key, value);return value;}else{return -1;}
};/** * @param {number} key * @param {number} value* @return {void}*/
LRUCache.prototype.put = function(key, value) {if(this.map.has(key)){let value = this.map.get(key);this.map.delete(key);}this.map.set(key, value);if(this.map.size > this.capacity){this.map.delete(this.map.keys().next().value);}
};/*** Your LRUCache object will be instantiated and called as such:* var obj = new LRUCache(capacity)* var param_1 = obj.get(key)* obj.put(key,value)*/

44 二叉树的中序遍历

在这里插入图片描述

  • 方法1:递归法。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {number[]}*/
var inorderTraversal = function(root) {var res = [];var traversal = function(root){if(root == null){return;}traversal(root.left);  // 左res.push(root.val);    // 根traversal(root.right); // 右}traversal(root);return res;
};
  • 方法2:迭代法。
  • 遍历顺序与处理顺序不同。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {number[]}*/
var inorderTraversal = function(root) {var res = []; // 存放结果var vis = []; // 模拟遍历队列,存放访问过的元素while(root != null || vis.length != 0){if(root != null){vis.push(root);root = root.left;   // 左}else{root = vis.pop();res.push(root.val); // 根root = root.right;  // 右}}return res;
};

45 二叉树的最大深度

在这里插入图片描述

  • 深度:任意节点到根节点的距离,使用前序遍历。
  • 高度:任意节点到叶子节点的距离,使用后序遍历。
  • 根节点的高度就是二叉树的最大深度。
  • 这里使用后序遍历,即通过求根节点高度得出二叉树的最大深度。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {number}*/
var maxDepth = function(root) {if(root == null){return 0;}var leftheight = maxDepth(root.left);var rightheight = maxDepth(root.right);var height = Math.max(leftheight, rightheight) + 1;return height;
};

相关文章:

【JavaScript】LeetCode:41-45

文章目录 41 排序链表42 合并k个升序链表43 LRU缓存44 二叉树的中序遍历45 二叉树的最大深度 41 排序链表 递归 归并排序找到链表中心点&#xff0c;从中心点将链表一分为二。奇数个节点找中心点&#xff0c;偶数个节点找中心左边的点作为中心点。快慢指针找中心点&#xff0c…...

数据结构(Day18)

一、周学习内容 1、9.18 数据结构&#xff08;Day15&#xff09;-CSDN博客 2、9.19 数据结构&#xff08;Day16&#xff09;-CSDN博客 3、9.20 链表 目的 插入删除不需要移动任何节点&#xff08;元素&#xff09;。 不需要预估存储空间大小&#xff0c;长度动态增长或减小。…...

error: ‘InsertAtTop‘ was not declared in this scope

Qt编译错误记录&#xff1a; 报错&#xff1a;error: ‘InsertAtTop’ was not declared in this scope ui->comboBoxJob->setInsertPolicy(InsertAtTop);这行代码在Qt中编译就会报这个错误&#xff0c;原因是输入参数需要加类名限定&#xff0c;改为&#xff1a; ui-…...

MySQL缓冲池详解

Buffer Pool 本文参考开源项目&#xff1a;小林coding在线文档&#xff1b; 01-缓冲池概述 ​ 在MySQL查询数据的时候&#xff0c;是通过存储引擎去磁盘做IO来获取数据库中的数据&#xff0c;这样每次查询一条数据都要去做一次或者多次磁盘的IO&#xff0c;无疑是非常慢的。…...

【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过

参考看雪课程&#xff1a;PWN 探索篇 前言 tcache key 的引入使得 tcache dup 利用出现了困难。除了简单利用 UAF 覆写 key 或者House Of Karui 之外&#xff0c;还可以利用 ptmalloc 中的其他机制进行绕过。 一、Tcache Stash with Fastbin Double Free 之前是 double free …...

How can I stream a response from LangChain‘s OpenAI using Flask API?

题意&#xff1a;怎样在 Flask API 中使用 LangChain 的 OpenAI 模型流式传输响应 问题背景&#xff1a; I am using Python Flask app for chat over data. In the console I am getting streamable response directly from the OpenAI since I can enable streming with a f…...

什么是慢充优惠话费充值api?如何选择平台

一、话费充值api的定义 话费充值api是一种能够让开发者将话费充值功能集成到自己的平台的接口。通过接入话费充值api接口&#xff0c;就能够实现话费充值平台的搭建&#xff0c;从而为用户提供话费充值服务&#xff0c;这一接口主要适用于对话费充值有长期稳定需求的企业或者商…...

【MySQL 03】表的操作

目录 1.在数据库内创建表 2.表的查询 3.表的插入 往数据库中插入数据 4.表的修改 5.删除表 1.在数据库内创建表 create table 表名(字段1 字段1类型); 这样我们就创建好了一张表&#xff0c;我们可以进入hellosql目录下进行查看&#xff1a;所以在数据库内建立表&#xf…...

3、论文阅读:EnYOLO:一种基于图像增强的水下目标区域自适应实时检测框架

图像增强和目标检测的结合 前言介绍相关工作UIE 水下图像增强UOD 水下目标检测UDA 水下域自适应方法介绍训练过程推理过程网络概述多阶段训练策略Burn-In Stage(预热阶段)Mutual-Learning Stage(相互学习阶段)Domain-Adaptation Stage(领域适应阶段)多阶段训练策略算法介…...

MYSQL面试知识点手册

第一部分&#xff1a;MySQL 基础知识 1.1 MySQL 简介 MySQL 是世界上最流行的开源关系型数据库管理系统之一&#xff0c;它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景&#xff0c;且广泛用于构建高并发、高可用的数据…...

排序算法的分析和应用

自己设计一个长度不小于10的乱序数组&#xff0c;用希尔排序&#xff0c;自己设定希尔排序参数 画出每一轮希尔排序的状态 自己设计一个长度不小于10的乱序数组&#xff0c;用堆排序&#xff0c;最终要生成升序数组&#xff0c;画出建堆后的状态 画出每一轮堆排序的状态 自…...

iptables限制网速

1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据&#xff0c;使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理&#xff0c;mode为srcip&#xff0c;有4个mode选项: srcip&#xff08;默认匹配每个源地址IP&#xff0c;配置指定源地址…...

ALSA ubuntu 编译

1、下载tar包:alsa-lib、alsa-utils GitHub - alsa-project/alsa-lib: The Advanced Linux Sound Architecture (ALSA) - library&#xff08;核心库&#xff09; GitHub - alsa-project/alsa-utils: The Advanced Linux Sound Architecture (ALSA) - utilities(工具库) 2、…...

【学习笔记】SSL/TLS证书安全机制之证书透明

1、概念 CT - Certificate Transparency&#xff0c;证书透明 2、Trying to Solve 如果意外的 CA 为我们的域名颁发证书&#xff0c;我们是不可见&#xff0c;这就是证书透明&#xff08;CT&#xff09;要解决的问题 3、How CT Works 任何CA机构颁发的所有证书的公共登记处&…...

网络编程问题解答

TCP/IP是哪种模型的协议 TCP/IP 是一组通信协议的集合&#xff0c;它基于 TCP/IP 模型。TCP/IP 模型通常被认为是一种实用的网络通信模型&#xff0c;与 OSI 模型相比&#xff0c;TCP/IP 模型更加简洁和侧重于实际应用&#xff0c;被广泛应用于互联网和大多数计算机网络中。 T…...

【开源免费】基于SpringBoot+Vue.JS服装商城系统(JAVA毕业设计)

本文项目编号 T 046 &#xff0c;文末自助获取源码 \color{red}{T046&#xff0c;文末自助获取源码} T046&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…...

C语言字符串学习

在C语言中&#xff0c;字符串&#xff08;String&#xff09;是字符数组&#xff08;character array&#xff09;&#xff0c;并且它以空字符&#xff08;\0&#xff09;结束&#xff0c;表示字符串的结尾。我们可以通过一些常见的操作和概念来详细理解它。 1. 字符串的概念 …...

当你在Linux系统中使用MySQL命令行工具查询数据库时,如果中文显示为问号(?)或其他乱码,简单解决办法。(2)

文章目录 1、问题出现2、解决办法 1、问题出现 2、解决办法 mysql -u [username] -p --default-character-setutf8 [database_name]rootab66508d9441:/# mysql -uroot -p123456 --default-character-setutf8 tingshu_album mysql: [Warning] Using a password on the command …...

API网关之Fizz Gateway

Fizz Gateway 是一款轻量级、高性能的 API 网关&#xff0c;专门为服务间通信、流量控制、请求路由、鉴权与认证等需求而设计。它旨在为分布式系统和微服务架构提供高效的请求处理能力&#xff0c;帮助开发者构建和管理 API 服务。 核心特性 1. 请求路由 Fizz Gateway 通过强…...

pgvector docker版安装;稀疏向量使用;psycopg2 python连接使用

参看: https://cloud.tencent.com/developer/article/2359831 https://hub.docker.com/r/pgvector/pgvector/tags https://github.com/pgvector/pgvector 一、安装 拉取0.7版本 docker pull pgvector/pgvector:0.7.4-pg16运行: docker run --name pgvector -v $(pwd)/dat…...

C#命令行参数解析库System.CommandLine介绍

命令行参数 平常在日常的开发过程中&#xff0c;会经常用到命令行工具。如cmd下的各种命令。 以下为sc命令执行后的截图&#xff0c;可以看到&#xff0c;由于没有输入任何附带参数&#xff0c;所以程序并未执行任何操作&#xff0c;只是输出了描述和用法。 系统在创建一个新…...

CCF CSP题解:密码(key)(202409-1)

题目和思路 题目背景 西西艾弗网对用户密码有一套安全级别评定标准。 题目描述 在西西艾弗网上&#xff0c;用户的密码是一个由大写字母&#xff08;A‐Z&#xff09;、小写字母&#xff08;a‐z&#xff09;、数字&#xff08;0‐9&#xff09;和特殊字符&#xff08;*和 …...

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案 &#x1f6e0;️ RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案摘要 &#x1f4c3;引言 ✨1. 什么是递归&#xff1f;&#x1f50d;1.1 递归的基本概念 &#x…...

Linux1-ls,cd,pwd

1.Linux操作系统的根目录用/表示。 Windows操作系统的根目录有D:E: 2.Linux命令格式 命令 [选项] [参数] 例如&#xff1a;ls -l / ls表示显示文件夹内容 -l表示以列表的形式展示 /表示显示的是根目录文件夹的内容 其中&#xff0c;[]里面的内容可省略&#xff…...

【高级编程】XML DOM4J解析XML文件(含案例)

文章目录 DOM4JDOM4J 解析 XML读取修改添加删除 XML&#xff08;EXtensible Markup Language&#xff09;&#xff0c;可扩展标记语言。一种用于存储和传输数据的标记语言。XML 与操作系统、编程语言的开发平台无关。实现不同系统之间的数据交换。 作用&#xff1a;数据交互&a…...

查看VSFTPD配置的服务器路径和linux系统有哪些用户

要查看VSFTPD (Very Secure FTP Daemon)配置中定义的服务器路径,需要检查VSFTPD的配置文件。这通常可以在配置文件中找到并有不同的选项来设置路径。 这里有几个方法可以查看配置的服务器路径: 1. 检查主配置文件 VSFTPD的默认配置文件通常位于`/etc/vsftpd.conf`。可以使用…...

JavaEE: 创造无限连接——网络编程中的套接字

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…...

记K8s组件harbor和kuboard故障恢复

#记录一次工作实践# 故障现象&#xff1a; 本地私有仓库harbor和控制台kuboard均无法正常登陆。 解决过程&#xff1a; 1、harbor恢复过程 通过docker ps -a |grep harbor查看harbor相关的容器状态&#xff0c;发现均显示启动状态&#xff0c;但是仓库无法访问。 通过doc…...

c++ return {};

https://segmentfault.com/q/1010000042734336 return {}; 表示“返回一个用空 列表初始化器 初始化的函数返回类型的对象”。确切的行为取决于返回对象的类型。 std::string get_string() {return {}; // an empty string is returned }...

【设计模式-适配】

Adapter Pattern&#xff08;适配器模式&#xff09; 是一种结构型设计模式&#xff0c;其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类&#xff0c;转换一个类的接口&#xff0c;使得原本不兼容的接口可以互相配合&#xff0c;从而实现接口的兼容性…...