题目

给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。

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

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

示例

输入: 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 = [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]

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-k-pairs-with-smallest-sums
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法1:优先队列

构造优先队列:和的小根堆。

Java实现
class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {List<List<Integer>> res = new ArrayList<>();//构造和的小根堆PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> (nums1[a[0]] + nums2[a[1]]) - (nums1[b[0]] + nums2[b[1]]));//先以nums1的数为基础,将00、10、20...入队//优化:最多入队 k 个就可以了,因为提示中 k 的范围较小,这样可以提高效率for (int i = 0; i < Math.min(k, nums1.length); i++) {pq.offer(new int[]{i, 0});}//00是最小的,要比较01,和10谁小//先将00出队,再将10入队,就可以实现比较while(k-- > 0 && !pq.isEmpty()) {int[] cur = pq.poll();List<Integer> var = new ArrayList<>();var.add(nums1[cur[0]]);var.add(nums2[cur[1]]);res.add(var);if (cur[1] + 1 < nums2.length) {pq.offer(new int[]{cur[0], cur[1] + 1});}}return res;}
}

力扣 373. 查找和最小的K对数字相关推荐

  1. Java实现 LeetCode 373 查找和最小的K对数字

    373. 查找和最小的K对数字 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找 ...

  2. ⭐算法入门⭐《堆》中等03 —— LeetCode 373. 查找和最小的K对数字

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给定两个以升序排列的整 ...

  3. LeetCode 373. 查找和最小的K对数字(自定义优先队列BFS)

    1. 题目 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找到和最小的 k 对数 ...

  4. 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)

    文章目录 题目描述 思路 && 代码 题目描述 几天没打题,感觉脑子都是一团浆糊.... 升序:肯定得用这条件来优化复杂度 数对:用 int[2] 来表示 思路 && ...

  5. Leetcode 373. 查找和最小的K对数字 解题思路及C++实现

    解题思路: 使用最大堆来存储k个和最小的数组组合,然后每进来一个数组组合,只需要和最大堆的堆顶进行比较即可. 用C++的priority_queue实现最大堆时,需要用一下pair来组合来自nums1 ...

  6. leetcode 373. Find K Pairs with Smallest Sums | 373. 查找和最小的K对数字(小根堆)

    题目 https://leetcode.com/problems/find-k-pairs-with-smallest-sums/ 题解 本来以为是个双指针+贪心,但是后来发现如果用双指针的话,指针并 ...

  7. [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  8. 力扣1002.查找常用字符

    力扣 1002. 查找常用字符 本人力扣练习已上传至码云,可互相学习借鉴. 难度-简单 题目: 给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表 ...

  9. 力扣 面试题 17.09. 第 k 个数

    题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数.注意,不是必须有这些素因子,而是必须不包含其他的素因子.例如,前几个数按顺序应该是 1,3,5,7,9,15,21. 示例 输入: ...

最新文章

  1. 201403-4 无线网络
  2. 太牛了 Python期末复习总结,提高成绩必备回家过个开心年
  3. .NET开发者常会忽略的几个错误
  4. DataGridRow的创建
  5. oracle sysauth,sysauth$基表的用户权限的一点分析
  6. 网络盘的计算机密码是什么情况,电脑e盘拒绝访问是什么原因?e盘加密方法
  7. vue引用jquery
  8. python分配问题_1.1python解决数学建模之席位分配问题
  9. day17 Python 反射获取内容和修改内容
  10. MVVM前后分离轻量级框架应用juicer和doT.js
  11. iOS如何优雅的处理“回调地狱Callback hell”(一)——使用PromiseKit
  12. 【数学建模】CUMCM-2014A 嫦娥三号软着陆过程 避障阶段图像处理
  13. 刷机-升级到3.90M33的方法
  14. ASP.NET 实习工作总结(前言)
  15. 交流有功功率、无功功率、视在功率计算
  16. 几个免费下载原版图书的网站
  17. c盘扩容提示簇被标记_如何解决C盘爆满
  18. 滴滴2020校招算法笔试 2019.08.27
  19. 记录win10突然卡死,只有鼠标能动,无法点击,大小写灯失效,只能强制关机
  20. 成功将TTF字体从18M裁剪到1.8M

热门文章

  1. 编程语言中的鸭子类型 Duck Typing
  2. php之box/spout 导入导出功能
  3. (精)Tableau数据可视化设计 实验报告
  4. 蝴蝶为花碎,花却随风飞
  5. 中望3D Overdrive内核技术之“容差建模”
  6. chef怎么读(chef怎么读英语)
  7. MacBook Air M1硬盘写入量查询
  8. 复杂背景下卷积神经网络在森林火灾识别中的研究与应用-代码实现
  9. Centos7、Centos Stream8、Centos Stream9无界面下使用yum安装chrome,方便进行Selenium无头模式自动化
  10. 根据离散点画直线,iOS离散点画曲线