LeetCode Meditations:合并 K 排序列表

在这里插入图片描述

描述 合并K分类列表 状态:

您有一系列 k 链接-列表 lists ,每个链接-列表按升序排序。

合并所有链接-列表为一个排序的链接-列出并返回。

例如:

Input: lists = [[1, 4, 5], [1, 3, 4], [2, 6]]
Output: [1, 1, 2, 3, 4, 4, 5, 6]
Explanation: The linked-lists are:
[1->4->5,1->3->4,2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6

起初这个问题有点让我感到困惑,但是 NEETCODE 很有意义。

解决方案的方法是 合并排序算法 ,这是您从任何介绍性计算机科学课程中可能记得的最熟悉的算法之一。

现在,当我们将数组作为输入作为输入时,我们通常会合并排序,我们将数组递归将数组分为左和右半,并继续合并它们,直到整个数组对整个数组进行排序。这是我们熟悉的朋友在JavaScript中的样子:

function mergeSort(arr) {if (arr.length <= 1) {return arr;}let left = arr.slice(0, Math.floor(arr.length / 2));let right = arr.slice(Math.floor(arr.length / 2), arr.length);mergeSort(left);mergeSort(right);merge(left, right, arr);return arr;
}function merge(left, right, arr) {let index = 0;while (left.length && right.length) {if (left[0] < right[0]) {arr[index++] = left.shift();} else {arr[index++] = right.shift();}}while (left.length) {arr[index++] = left.shift();}while (right.length) {arr[index++] = right.shift();}
}

但是,我们要使用的是 * merge 功能。

由于我们还使用链接列表,因此看起来会有所不同。使用TypeScript,看起来像这样:

function merge(list1: ListNode | null, list2: ListNode | null) {let result = new ListNode(0);let currentNode = result;while (list1 !== null && list2 !== null) {if (list1.val < list2.val) {currentNode.next = list1;list1 = list1.next;} else {currentNode.next = list2;list2 = list2.next;}currentNode = currentNode.next;}if (list1 !== null) {currentNode.next = list1;}if (list2 !== null) {currentNode.next = list2;}return result.next;
}

自从我们给予 k 排序列表,我们将合并列表对,并继续合并 lists 大于1:

function mergeKLists(lists: Array<ListNode | null>): ListNode | null {if (lists === null || lists.length === 0) {return null;}while (lists.length > 1) {let mergedLists = [];for (let i = 0; i < lists.length; i += 2) {let list1 = lists[i];let list2 = i + 1 < lists.length ? lists[i + 1] : null;mergedLists.push(merge(list1, list2));}lists = mergedLists;} return lists[0];
};
笔记
如果 list2null (在长度的情况下 lists 甚至不是),合并 list1list2 将是 list1

总体而言,解决方案看起来像这样:

/*** Definition for singly-linked list.* class ListNode {*   val: number*   next: ListNode | null*   constructor(val?: number, next?: ListNode | null) {*     this.val = (val === undefined ? 0 : val)*     this.next = (next === undefined ? null : next)*   }* }*/function mergeKLists(lists: Array<ListNode | null>): ListNode | null {if (lists === null || lists.length === 0) {return null;}while (lists.length > 1) {let mergedLists = [];for (let i = 0; i < lists.length; i += 2) {let list1 = lists[i];let list2 = i + 1 < lists.length ? lists[i + 1] : null;mergedLists.push(merge(list1, list2));}lists = mergedLists;} return lists[0];
};function merge(list1: ListNode | null, list2: ListNode | null) {let result = new ListNode(0);let currentNode = result;while (list1 !== null && list2 !== null) {if (list1.val < list2.val) {currentNode.next = list1;list1 = list1.next;} else {currentNode.next = list2;list2 = list2.next;}currentNode = currentNode.next;}if (list1 !== null) {currentNode.next = list1;}if (list2 !== null) {currentNode.next = list2;}return result.next;
}
时间和空间复杂性

时间复杂性是o(n log k)o(n\ log\ k) - 也看 NEETCODE的解释 - ,如果您记得合并排序功能的时间复杂性是o(n log n)o(n\ 日志\ n) :我们通过合并操作中的每个项目,但是由于每次输入都会减半,我们会记录NLOG\ n次。在这里类似,nn是指节点的数量,而kk是列表的数量。
空间复杂性是O(k)o(k) 当我们保留临时的时,kk是列表的数量 mergedLists 多变的。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地理信息系统(ArcGIS)在水文水资源、水环境中的应用

刘老师&#xff08;副教授&#xff09;&#xff1a;来自北京重点高校资深专家&#xff0c;长期从事水资源与水环境、流域污染控制与管理、非点源模拟与控制、环境信息系统开发、环境遥感与GIS应用等领域的研究&#xff0c;发表多篇Sci论文、具有资深的技术底蕴和专业背景。 1、…

MapTracker:Tracking with Strided Memory Fusion for Consistent Vector HD Mapping

参考代码&#xff1a;MapTracker 动机与出发点 为了提升帧间检测的稳定性通常会添加时许信息&#xff0c;这个可以BEV特征处做时序融合&#xff0c;也可以是用当前帧query去cross-attn历史帧信息&#xff0c;则更多的时候是将之前帧信息与当前做融合或者cross-attn实现信息传…

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询&#xff1a; 猜解列名 ?id1) order by 3-…

SIC知识--(1):来龙去脉

一、碳化硅的起源 1891年&#xff0c;当时爱德华古德里奇艾奇逊在尝试制造人造金刚石的过程中意外发现了这一材料。艾奇逊将黏土&#xff08;铝硅酸盐&#xff09;与粉状焦炭&#xff08;碳&#xff09;混合后在电炉中加热&#xff0c;预期得到金刚石&#xff0c;却意外获得了一…

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

Mac安装配置ElasticSearch和Kibana 8.13.2

系统环境&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) 一、准备 从Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic上下载ElasticSearch和Kibana 笔者下载的是 elasticsearch-8.13.2-darwin-aarch64.tar.gz kibana-8.13.2-darwin-aarch64.tar.gz 并放置到个人…

关于ASP.NET Core WebSocket实现集群的思考

前言 提到WebSocket相信大家都听说过&#xff0c;它的初衷是为了解决客户端浏览器与服务端进行双向通信&#xff0c;是在单个TCP连接上进行全双工通讯的协议。在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮询&#xff0c;来实现服务端的变更响应到客户端&…

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

机器学习实训 Day1

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

专为苹果系统设计的精美可视化图表 | 开源日报 No.219

danielgindi/Charts Stars: 27.3k License: Apache-2.0 Charts 是为 iOS/tvOS/OSX 提供美观图表的开源项目&#xff0c;是跨平台 MPAndroidChart 在苹果设备上的实现。该项目提供了以下主要功能和优势&#xff1a; 支持 iOS、tvOS 和 macOS 平台使用 Swift 编写&#xff0c;可…

Harmony鸿蒙南向驱动开发-PWM

PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff0c;是一种对模拟信号电平进行数字编码并将其转换为脉冲的技术&#xff0c;广泛应用在从测量、通信到功率控制与变换的许多领域中。通常情况下&#xff0c;在使用马达控制、背光亮度调节时会用到PWM模…

数据降维方法-主成分分析(PCA)

目录 一、前言 二、向量的表示及基变换 三、基变换 四、协方差矩阵 五、协方差 六、优化目标 一、前言 主成分分析(Principal Component Analysis) 用途&#xff1a;降维中的常用手段 目标&#xff1a;提取最有价值的信息&#xff08;基于方差&#xff09; 问题&#x…

Acwing.4009 收集卡牌(期望dp)

题目 小林在玩一个抽卡游戏&#xff0c;其中有 n种不同的卡牌&#xff0c;编号为 1到 n。 每一次抽卡&#xff0c;她获得第 i种卡牌的概率为 pi。 如果这张卡牌之前已经获得过了&#xff0c;就会转化为一枚硬币。 可以用 k枚硬币交换一张没有获得过的卡。 小林会一直抽卡&…

最祥解决python 将Dataframe格式数据上传数据库所碰到的问题

碰到的问题 上传Datafrane格式的数据到数据库 会碰见很多错误 举几个很普遍遇到的问题(主要以SqlServer举例) 这里解释下 将截断字符串或二进制数据 这个是字符长度超过数据库设置的长度 然后还有字符转int失败 或者字符串转换日期/或时间失败 这个是碰到的需要解决的最多的问…

网站HTTP升级成为HTTPS的方法

将网站从HTTP免费升级为HTTPS&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; - 为了免费升级&#xff0c;您可以选择使用JoySSL这样的公益项目。JoySSL提供免费、自动化的SSL/TLS证书颁发服务&#xff0c;适用于各…

三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)

在OpenCV中可以通过ImRead方法读取照片&#xff0c;通过ImShow方法显示照片&#xff1b;但是无法在PictureBox控件中显示 PictureBox控件只能展示Bitmap和Image数据类型图片 为此查阅了网上很多篇博文&#xff0c;将三种数据类型之间的转换进行了归纳整理&#xff0c;感谢网上…

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者…

【mT5多语言翻译】之一——实战项目总览

[1] 总览 【mT5多语言翻译】系列共六篇文章&#xff1a; 【mT5多语言翻译】之一——实战项目总览   【mT5多语言翻译】之二——模型&#xff1a;T5模型与mT5模型与前置知识   【mT5多语言翻译】之三——数据集&#xff1a;多语言翻译数据集与预处理   【mT5多语言翻译】之…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

代码随想录--数组--移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度…