Leetcode 剑指 Offer II 061. 查找和最小的 K 对数字

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定两个以升序排列的整数数组 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]

示例 2:

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

示例 3:

  • 输入: nums1 = [1,2], nums2 = [3], k = 3
  • 输出: [1,3],[2,3]
  • 解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]

提示:

  • 1 <= nums1.length, nums2.length <= 10^4
  • -10^9 <= nums1[i], nums2[i] <= 10^9
  • nums1, nums2 均为升序排列
  • 1 <= k <= 1000

题目思考

  1. 如何尽可能优化复杂度?

解决方案

思路
  • 分析题目, 一个很容易想到的思路就是枚举所有的数字对, 然后对它们的和进行排序, 最小的 k 对即为所求
  • 不过这种方法的复杂度达到了 O(n^2logn), 有没有更优的方法呢?
  • 题目要求最小的 k 对数字, 这不难联想到前面的题目Leetcode 剑指 Offer II 059. 数据流中的第 K 大元素, 我们这里也可以利用类似的思路, 将排序转换成大小为 k 的最大堆, 这样遍历完所有数字对后, 堆中的 k 个数字对就是最终结果, 这样复杂度来到了 O(n^2logk), 是否还能进一步优化呢?
  • 上面的思路都没有利用题目中升序排列这一条件, 由于两个数组都是升序排列, 显然下标[0,0]的数字对就是最小的, 次小的则一定只可能是下标[0,1]或者[1,0], 这就引出了下面的思路:
    • 维护一个最小堆, 存储三元组[数字对之和, 第一个数组下标, 第二个数组下标], 简写为[sm,i,j]
    • 初始化将下标[0,0]对应的三元组加入堆中
    • 然后开始循环, 弹出堆顶[sm,i,j], 将对应数字对[nums[i],nums[j]]加入最终结果中, 并将紧邻它的数字对[i+1,j][i,j+1]各自对应的三元组加入堆中
    • 特别注意, 数字对可能被重复添加, 例如堆顶[1,2]和堆顶[2,1]同样都有紧邻数字对[2,2]
    • 所以我们需要额外的集合来存储已经加入堆中的数字对, 如果该数字对已经在集合中, 就不再重复添加
    • 这样不断循环, 直到最终结果的长度达到 k, 或者堆变空时结束
  • 通过上述做法, 我们只需要循环 k 次, 而每次对堆的操作都只需要 O(logk), 从而成功将复杂度降低到了 O(klogk)
  • 下面代码中有详细的注释, 方便大家理解
复杂度
  • 复杂度 O(klogk): 只需要循环 k 次, 而每次对堆的操作都只需要 O(logk), 所以整体是 O(klogk)
  • 空间复杂度 O(k): 堆和集合都需要存储 k 个元素
代码
class Solution:
    def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:
        # 注意可能添加重复元素, 所以需要v集合
        if not nums1 or not nums2:
            # 没有符合要求的数字对
            return []
        res = []
        # 最小堆初始时存储[0,0]对应的三元组
        pq = [(nums1[0] + nums2[0], 0, 0)]
        # 集合初始化存储下标对(0,0)
        v = {(0, 0)}
        while len(res) < k and pq:
            # 弹出当前最小的数字对, 并将其追加到最终结果中
            _, i, j = heapq.heappop(pq)
            res.append([nums1[i], nums2[j]])
            for ii, jj in ((i + 1, j), (i, j + 1)):
                # 将尚未遍历的紧邻数字对加入堆和集合中
                if ii < len(nums1) and jj < len(nums2) and (ii, jj) not in v:
                    v.add((ii, jj))
                    heapq.heappush(pq, (nums1[ii] + nums2[jj], ii, jj))
        return res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【GNN2】PyG完成图分类任务,新手入门,保姆级教程

上次讲了如何给节点分类&#xff0c;这次我们来看如何用GNN完成图分类任务&#xff0c;也就是Graph-level的任务。 【GNN 1】PyG实现图神经网络&#xff0c;完成节点分类任务&#xff0c;人话、保姆级教程-CSDN博客 图分类就是以图为单位的分类&#xff0c;举个例子&#xff1…

服务器管理平台开发(3)- Web后端

Web服务端 整体架构采用前后端分离形式&#xff0c;后端使用Golang实现&#xff0c;参考Gin框架 1、后端服务 1.1、服务端架构 代码可参考Github开源项目&#xff1a;https://github.com/pbrong/hrms 1.2、服务地址 http://x.x.x.x:8000/api/v1/meta/info http://x.x.x.x:800…

算法第十七天-构造有效字符串的最少插入数

构造有效字符串的最少插入数 题目要求 解题思路 考虑abc的个数 假设答案有n个"abc"组成&#xff0c;那么需要插入的字符个数为 3 ∗ n − l e n ( s ) 3*n - len(s) 3∗n−len(s)。 对于相邻的两个字符x和y&#xff08;x在y左侧&#xff09;&#xff1a; 如果 x…

anaconda创建虚拟环境启动jupyter notebook

1.进入虚拟环境 &#xff08;以环境名为py37_pytorch1.9为例&#xff09; 创建虚拟环境: conda create -n py37_pytorch1.9 python3.7 查看已经创建的虚拟环境&#xff1a; ​​​​​​​conda env list 切换/进入环境&#xff1a; conda activate py37_pytorch1.9 删除环…

MathType绝对是我数学编辑的首选工具!

去年&#xff0c;微软曾说&#xff0c;要去掉Office里的公式编辑器&#xff0c;建议用户使用MathType编辑公式。目前Office用户可以到微软官网安装MathType的插件&#xff0c;现在免费使用&#xff0c;以后要收费。Word里安装这个插件以后&#xff0c;就会出现MathType的菜单。…

最好的 8 个解锁 Android 手机的应用程序分析

如何解锁我的 Android 手机是一个困扰全球数百万人的问题。有多种Android解锁器可用于解锁手机。用户应确保选择最好的应用程序以轻松满意地完成工作。必须注意的是&#xff0c;数据在解锁手机的整个过程中都是安全可靠的。此类应用程序还应该能够在所有情况下检索数据。 锁屏移…

论文阅读:Feature Refinement to Improve High Resolution Image Inpainting

项目地址&#xff1a;https://github.com/geomagical/lama-with-refiner 论文地址&#xff1a;https://arxiv.org/abs/2109.07161 发表时间&#xff1a;2022年6月29日 项目体验地址&#xff1a;https://colab.research.google.com/github/advimman/lama/blob/master/colab/LaMa…

设计模式之访问者模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

Redis重点总结补充

Redis重点总结 1.redis分布式锁 2.redission实现分布式锁 注意&#xff1a;加锁、设置过期时间等操作都是基于lua脚本完成. redisson分布式锁&#xff0c;实现可重入&#xff08;前提是同一个线程下 3.redis主从集群 实现主从复制 ( Master-slave Replication)的工作原理 : …

Vulnhub靶机:driftingblues 1

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;driftingblues1&#xff08;10.0.2.17&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entr…

redis夯实之路-主从复制详解

Redis中可以通过执行slaveof命令或者设置slaveof选项&#xff0c;让一个服务器区复制另一个服务器&#xff0c;被复制的为主服务器&#xff0c;复制的为从服务器。 复制 Redis中可以通过执行slaveof命令或者设置slaveof选项&#xff0c;让一个服务器区复制另一个服务器&#…

实录分享 | 央企大数据平台架构发展趋势与应用场景的介绍

分享嘉宾&#xff1a; 孟子涵-中国华能集团信息中心平台架构师 2021年华能就与Alluxio建立了合作&#xff0c;共同写了整个华能统一纳管的架构方案。这个方案我认为是现在我们在央企里边比较核心的一套体系&#xff0c;能让全集团所有我们认为重要的数字化资源实现真正的统一集…

什么是网络数据抓取?有什么好用的数据抓取工具?

一、什么是网络数据抓取 网络数据抓取&#xff08;Web Scraping&#xff09;是指采用技术手段从大量网页中提取结构化和非结构化信息&#xff0c;按照一定规则和筛选标准进行数据处理&#xff0c;并保存到结构化数据库中的过程。目前网络数据抓取采用的技术主要是对垂直搜索引…

U盘用完到底能不能直接拔?一篇搞懂

有没有人懂这种情况&#xff01;&#xff01; 传输完文件之后&#xff0c;觉得大功告成 以十分帅气的姿势 and 迅雷不及掩耳之势 “咻”地一下把U盘直接给……拔掉了…… 然后瞬间想起没有安全退出&#xff0c;陷入深深的懊悔…… &#xff08;甚至还要再花时间&#xff0…

使用 EmbeddingBag 和 Embedding 完成词嵌入

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客\n&#x1f366; 参考文章&#xff1a;365天深度学习训练营\n&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.co…

【开源】基于JAVA语言的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

Sectigo有几种泛域名SSL证书买一年送一个月

Sectigo是一家知名的数字证书颁发机构&#xff0c;提供了很多种类型的SSL证书&#xff0c;可以满足不同用户的需求。其中&#xff0c;泛域名SSL证书是一种常见的证书类型&#xff0c;可以同时保护主域名以及主域名下所有子域名。今天就随SSL盾小编了解Sectigo旗下有几种泛域名S…

【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)

HashMap工作原理全揭秘 — 核心源码解析 知识盲点概念介绍数据结构数组链表数组VS链表哈希表不同JVM版本HashMap的展现形式 HashMap VS HashTable特性区别对比 hashcodehashCode的作用equals方法和hashcode的关系key为null怎么办执行步骤 核心参数容量探讨负载因子探讨加载因子…

JVM基础(11)——G1垃圾回收器

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

用vcpkg安装openssl

用vcpkg安装openssl 背景解决方案1 安装vcpkg1.1 下载代码组件1.1 生成vcpkg.exe1.2 安装openssl 2 配置环境变量3 重新编译运行&#xff0c;正常通过 背景 最近学习Rust的时候&#xff0c;有个依赖需要用到Openssl&#xff0c;但是cargo编译的时候提示如下信息&#xff1a; …