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.mzph.cn/news/806423.shtml

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

相关文章

4.5 文字绘制

PutText 函数在图像中呈现指定的文本字符串。不能使用指定字体呈现的符号将由问号替换。 void cv::putText ( cv::Mat & img,//待绘制的图像 const String & text,//待绘制的文字 Point org,//文本框的左下角 int fontFace,//字体类型 double fontScale,//尺寸因…

虹科Pico汽车示波器 | 免拆诊断案例 | 2011款东风悦达起亚K5车发动机偶尔起动困难

一、故障现象 一辆2011款东风悦达起亚K5车&#xff0c;搭载G4KD发动机&#xff0c;累计行驶里程约为24.5万km。车主反映&#xff0c;第1次起动发动机时偶尔无法起动着机&#xff0c;第2次能够正常起动着机&#xff0c;但发动机故障灯异常点亮。为此在其他维修厂维修过&#xf…

网站HTTP升级成为HTTPS的方法

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

【linux】yum 和 vim

yum 和 vim 1. Linux 软件包管理器 yum1.1 什么是软件包1.2 查看软件包1.3 如何安装软件1.4 如何卸载软件1.5 关于 rzsz 2. Linux编辑器-vim使用2.1 vim的基本概念2.2 vim的基本操作2.3 vim命令模式命令集2.4 vim底行模式命令集2.5 vim操作总结补充&#xff1a;vim下批量化注释…

FFmpeg: 简易ijkplayer播放器实现--01项目简介

文章目录 项目介绍流程图播放器实现过程界面展示 项目介绍 此项目基于FFmeg中 ffplay.c进行二次开发&#xff0c;实现基本的功能&#xff0c;开发软件为Qt 项目优势&#xff1a; 参考ijkplayer播放器&#xff0c;实现UI界面和播放器核心进行解耦&#xff0c;容易添加其他功能…

ELK企业日志分析系统介绍

前言 随着企业级应用系统日益复杂&#xff0c;随之产生的海量日志数据。传统的日志管理和分析手段&#xff0c;难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下&#xff0c;ELK日志分析系统应运而生。本文将从ELK 日志分析系统的原理、架构及其在实践中的应用做相…

Centos7下docker的jenkins下载并配置jdk与maven【图文教程】

个人记录 进入目录 cd /usr/local/JDK下载与配置 OpenJDK官网 下载安装 wget https://download.java.net/openjdk/jdk18/ri/openjdk-1836_linux-x64_bin.tar.gz解压 tar -zxvf openjdk-1836_linux-x64_bin.tar.gz ls ls jdk-18/编辑配置文件 vim /etc/profile配置环境变…

elementui树形组件自定义高亮颜色

1、需求描述&#xff1a;点击按钮切换树形的章节&#xff0c;同时高亮 2、代码实现 1&#xff09;style样式添加 <style> .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {background-color: #81d3f8 !important; //高亮颜色colo…

【C++题解】1005 - 已知一个圆的半径,求解该圆的面积和周长

问题&#xff1a;1005 - 已知一个圆的半径&#xff0c;求解该圆的面积和周长 类型&#xff1a;基础问题、小数运算 题目描述&#xff1a; 已知一个圆的半径&#xff0c;求解该圆的面积和周长。 输入&#xff1a; 输入只有一行&#xff0c;只有 1 个整数。 输出&#xff1a…

javaWeb网上零食销售系统

1 绪 论 目前&#xff0c;我国的网民数量已经达到7.31亿人&#xff0c;随着互联网购物和互联网支付的普及&#xff0c;使得人类的经济活动进入了一个崭新的时代。淘宝&#xff0c;京东等网络消费平台功能的日益完善&#xff0c;使得人们足不出户就可以得到自己想要的东西。如今…

[leetcode]remove-duplicates-from-sorted-list-ii

. - 力扣&#xff08;LeetCode&#xff09; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&…

分类模型绘制决策边界、过拟合、评价指标

文章目录 1、线性逻辑回归决策边界1.2、使用自定义函数绘制决策边界1.3、三分类的决策边界1.4、多项式逻辑回归决策边界 2、过拟合和欠拟合2.2、欠拟合2.3、过拟合 3、学习曲线4、交叉验证5、泛化能力6、混淆矩阵7、PR曲线和ROC曲线 x2可以用x1来表示 1、线性逻辑回归决策边界 …

HarmonyOS 开发-阻塞事件冒泡

介绍 本示例主要介绍在点击事件中&#xff0c;子组件enabled属性设置为false的时候&#xff0c;如何解决点击子组件模块区域会触发父组件的点击事件问题&#xff1b;以及触摸事件中当子组件触发触摸事件的时候&#xff0c;父组件如果设置触摸事件的话&#xff0c;如何解决父组…

HTML和markdown

总体情况 <p>在html的用处 在vscode中使用markdown [Markdown] 使用vscode开始Markdown写作之旅 - 知乎

如何训练自己的ChatGPT?需要多少训练数据?

近年&#xff0c;聊天机器人已经是很常见的AI技术。小度、siri、以及越来越广泛的机器人客服&#xff0c;都是聊天机器人的重要适用领域。然而今年&#xff0c;ChatGPT的面世让这一切都进行到一个全新的高度&#xff0c;也掀起了大语言模型&#xff08;LLM&#xff09;的热潮。…

python使用uiautomator2操作雷电模拟器9并遇到解决adb 连接emulator-5554 unauthorized问题

之前写过一篇文章 python使用uiautomator2操作雷电模拟器_uiautomator2 雷电模拟器-CSDN博客 上面这篇文章用的是雷电模拟器4&#xff0c;雷电模拟器4.0.78&#xff0c;android版本7.1.2。 今天有空&#xff0c;再使用雷电模拟器9&#xff0c;android版本9来测试一下 uiauto…

华为2024年校招实习硬件-结构工程师机试题(四套)

华为2024年校招&实习硬件-结构工程师机试题&#xff08;四套&#xff09; &#xff08;共四套&#xff09;获取&#xff08;WX: didadidadidida313&#xff0c;加我备注&#xff1a;CSDN 华为硬件结构题目&#xff0c;谢绝白嫖哈&#xff09; 结构设计工程师&#xff0c;结…

最新ChatGPT4.0工具使用教程:GPTs使用,Midjourney绘画,AI换脸,Suno-AI音乐生成大模型一站式系统使用教程

一、前言 ChatGPT3.5、GPT4.0、相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普通用户来说都是需要额外付费才可以…

抖音视频无水印采集拓客软件|视频批量下载提取工具

抖音视频无水印批量采集拓客软件助力高效营销&#xff01; 随着抖音平台的崛起&#xff0c;视频已成为各行各业进行营销的重要工具。但是&#xff0c;传统的视频下载方式往往效率低下&#xff0c;无法满足快速获取大量视频的需求。针对这一问题&#xff0c;我们开发了一款视频无…

R语言复现:轨迹增长模型发表二区文章 | 潜变量模型系列(2)

培训通知 Nhanes数据库数据挖掘&#xff0c;快速发表发文的利器&#xff0c;你来试试吧&#xff01;欢迎报名郑老师团队统计课程&#xff0c;4.20直播。 案例分享 2022年9月&#xff0c;中国四川大学学者在《Journal of Psychosomatic Research》&#xff08;二区&#xff0c;I…