【堆】Leetcode 373. 查找和最小的 K 对数字【中等】

查找和最小的 K 对数字

  • 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。

  • 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。

  • 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。

示例 1:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

解题思路

  • 使用最小堆(优先队列):利用最小堆来存储当前可能的最小数对,并每次从堆中取出最小的数对。
  • 初始化堆:将数组 nums1 中的前 k 个元素与 nums2 的第一个元素配对并加入堆中。由于数组是有序的,nums1[i] + nums2[0] 一定是 nums1[i] 相关的最小和。
  • 扩展堆:每次从堆中取出最小的数对 (u, v),然后将 (u, v_next)(其中 v_next 是 v 在 nums2 中的下一个元素)加入堆中,一定是 nums2[j] 相关的最小和,nums1[i]相关的最小和和nums2[j]相关的最小和都在一个最小堆中,一定能获取到当前的最小和。
  • 停止条件:重复上述过程直到找到 k 个数对。

Java实现

public class KSmallestPairs {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {List<List<Integer>> result = new ArrayList<>();if (nums1.length == 0 || nums2.length == 0 || k == 0) {return result;}// 最小堆,堆元素是三元组 (sum, i, j)PriorityQueue<int[]> minHeap = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));// 初始化堆,nums1 中的前 k 个元素与 nums2 的第一个元素配对for (int i = 0; i < Math.min(nums1.length, k); i++) {minHeap.offer(new int[]{nums1[i] + nums2[0], i, 0});}// 找到 k 个数对while (k-- > 0 && !minHeap.isEmpty()) {int[] current = minHeap.poll();  // 从堆中取出最小元素int i = current[1];  // 获取第一个数组 nums1 的索引int j = current[2];  // 获取第二个数组 nums2 的索引List<Integer> pair = new ArrayList<>();pair.add(nums1[i]);pair.add(nums2[j]);result.add(pair);  // 将当前数对加入结果列表// 如果 nums2 中有下一个元素,则将 (nums1[i], nums2[j+1]) 加入堆if (j + 1 < nums2.length) {minHeap.offer(new int[]{nums1[i] + nums2[j + 1], i, j + 1});}}return result;}// 测试用例public static void main(String[] args) {KSmallestPairs solution = new KSmallestPairs();int[] nums1 = {1, 7, 11};int[] nums2 = {2, 4, 6};int k = 3;List<List<Integer>> result = solution.kSmallestPairs(nums1, nums2, k);for (List<Integer> pair : result) {System.out.println(pair);}// 期望输出: [1, 2], [1, 4], [1, 6]}
}

时间空间复杂度

  • 时间复杂度:初始化堆的时间复杂度是 O(klogk),因为将最多 k 个元素加入堆。
    在最坏情况下,堆中最多包含 k 个元素,每次操作(插入和删除)需要 O(logk) 时间。因此,总体时间复杂度为 O(klogk+klogk)=O(klogk)

  • 空间复杂度:最小堆最多包含 k 个元素,因此空间复杂度是 O(k)。

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

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

相关文章

C++中的中介者模式

目录 中介者模式&#xff08;Mediator Pattern&#xff09; 实际应用 聊天室 空中交通管制系统 智能家居控制系统 总结 中介者模式&#xff08;Mediator Pattern&#xff09; 中介者模式是一种行为型设计模式&#xff0c;它定义了一个对象来封装一系列对象之间的交互。通…

02 Pytorch_NLP

1. N-gram n决定关联信息 2. TF____IDF TF&#xff1a;词频 IDF&#xff1a;逆向序列 假如&#xff1a;TF * IDF 就是当前的文件&#xff0c;那么乘积反而更大&#xff01; 因为它只出现在 特定的文章中&#xff01; TF-IDF 简介 TF-IDF&#xff08;Term Frequency-Inverse…

css入门基础

目录 1. CSS前景 2.什么是CSS 3.CSS发展史 4.CSS的3种样式格式 5.CSS 的语法 6.CSS的字体样式 7.选择器类型 8.CSS外观属性 1. CSS前景 从HTML被发明开始&#xff0c;样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只…

专业学习|博弈论-博弈论概述

&#xff08;一&#xff09;认识博弈论&#xff1a;解析复杂决策与策略 &#xff08;1&#xff09;认识博弈 博弈论广泛应用于分析个体间因利益冲突而产生的决策问题。通过构建不同模型来探讨如经贸关系、军事威胁等问题&#xff0c;旨在寻找均衡解并提供新知&#xff0c;相较…

mathematical-expression-cpp | C++ 数学表达式解析库

数学表达式-cpp Switch to English Document 介绍 本框架是一种针对数学公式解析的有效工具&#xff0c;能够通过C的API解析包含嵌套函数&#xff0c;包含函数&#xff0c;数列步长累加等数学公式&#xff0c;返回值是一个数值的结果对象&#xff0c;同时也可以进行比较运算…

idea在空工程中添加新模块并测试的步骤

ServicesTest是空的工程&#xff0c;没有pom文件。现在需要在ServicesTest目录下添加新模块作为新的工程&#xff0c;目的是写一下别的技术功能。 原先目录结构&#xff0c;ServicesTest是空的工程&#xff0c;没有pom文件。下面的几个模块是新的工程&#xff0c;相互独立。 1.…

LLM大模型的挑战与未来,挑战大但是机遇更大!

大模型必然是未来很长一段时间我们工作生活的一部分&#xff0c;而对于这样一个与我们生活高度同频互动的“大家伙”&#xff0c;除了性能、效率、成本等问题外&#xff0c;大规模语言模型的安全问题几乎是大模型所面对的所有挑战之中的重中之重&#xff0c;机器幻觉是大模型目…

JAVA Spring WebSocket 实时消息

代码环境: jdk8, spring-boot1.5.22 依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.22.RELEASE</version><relativePath /> <…

C++ (week6、7):Linux系统编程4:网络

文章目录 四、网络和网络编程(一) 网络协议1.基础概念2.网络协议和网络模型&#xff1a;OSI七层模型、TCP/IP四层协议3.TCP协议(1)TCP协议的特点(2)TCP协议的首部格式(3)TCP状态图(4)为什么要三次握手&#xff1f;2次行不行&#xff1f;(5)为什么要四次挥手&#xff1f;(6)快速…

软件测试分类介绍

大家好&#xff0c;软件测试是确保软件质量的关键环节之一&#xff0c;通过对软件系统的各个方面进行测试&#xff0c;可以发现和解决潜在的问题&#xff0c;提高软件的稳定性、可靠性和用户满意度。在软件测试领域&#xff0c;根据测试的目的、方法和对象的不同&#xff0c;可…

什么是BMS?电池管理系统(BMS)到底在管理哪些东西?

BMS是电池管理系统&#xff08;Battery Management System&#xff09;的缩写。 它是一种用于管理和监控电池组的系统&#xff0c;通过监测电池状态、控制充放电过程、保护电池安全等功能&#xff0c;确保电池组的安全、稳定和高效运行。 BMS通常应用于电动汽车、储能系统、航…

Python业务规则引擎库之rules使用详解

概要 在软件开发中,业务规则引擎是一种重要的工具,可以帮助开发者将复杂的业务逻辑从代码中解耦出来,并以更直观的方式进行管理和维护。rules 是一个轻量级的 Python 库,专门用于定义和执行业务规则。它提供了一种简洁且强大的方式来管理应用程序中的规则逻辑,使代码更加…

C++ 引用 - 引用的特点|在优化程序上的作用

引用是C 的一个别名机制&#xff0c;所谓别名&#xff0c;就是同一块内存共用多个名字&#xff0c;每个名字都指的是这片空间&#xff0c;通过这些别名都能访问到同样的一块空间。 就像鲁迅和周树人是同一个人。 ——鲁迅 一、引用的基本用法 int a 10; int& ref a; // …

Kafka之ISR机制的理解

文章目录 Kafka的基本概念什么是ISRISR的维护机制ISR的作用ISR相关配置参数同步过程示例代码总结 Kafka中的ISR&#xff08;In-Sync Replicas同步副本&#xff09;机制是确保数据高可用性和一致性的核心组件。 Kafka的基本概念 在Kafka中&#xff0c;数据被组织成主题&#xf…

巴中青少年编程:开启未来科技的无限可能

巴中青少年编程&#xff1a;开启未来科技的无限可能 在数字化时代&#xff0c;编程已成为一项重要的技能&#xff0c;而巴中的青少年们正积极投身其中&#xff0c;探索编程的奥秘。那么&#xff0c;巴中青少年编程究竟有什么用处呢&#xff1f;本文将从四个方面、五个方面、六…

Django序列化器详解:普通序列化器与模型序列化器的选择与运用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

充电桩出口:跨国贸易的机遇与挑战之旅

在新能源浪潮席卷全球的今天&#xff0c;充电桩作为电动汽车的“加油站”&#xff0c;正逐渐从幕后走向台前。 而在这场跨国贸易的舞台上&#xff0c;充电桩的出口之路&#xff0c;既充满了诱人的机遇&#xff0c;也伴随着不小的挑战。 机遇&#xff0c;源自日益增长的全球市场…

免费听歌,电脑或手机免费听歌,落雪音乐安装详细步骤

近年来&#xff0c;由于资本的力量导致各种收费&#xff0c;看个电视想听歌都必须要付费了&#xff0c;否则你听不完整&#xff0c;吃相非常难看&#xff0c;特别是电视&#xff0c;吸血鬼式吸收各种会员费&#xff0c;各种APP也是铺天盖地的广告&#xff0c;渐渐迷失了自我&am…

JSP设计理念并没有过时

在JSP (JavaServer Pages) 中&#xff0c;可以使用include特性&#xff0c;include 主要有两种形式&#xff1a;include 指令和 <jsp:include> 动作元素。这两种方式都用于在JSP页面中包含其他资源&#xff0c;但它们的工作方式和应用场景有所不同。 1. include 指令 i…