373. 查找和最小的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]

示例 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]

PS:
indexArray的标记每一次都会加加,以至于是不能找到重复的,

class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {List<List<Integer>> result = new ArrayList<>();if (k <= 0) {return result;}// 搜索的起始位置,主要起到优化作用减少循环次数int[] indexArray = new int[nums1.length];int startIndex = 0;while (result.size() < k) {// 记录当前最小对的和int min = Integer.MAX_VALUE;// 记录当前最小对的位置int currentIndex = -1;for (int i = startIndex; i < nums1.length; i++) {// 这里说明nums1[i]已经与nums2中所有元素结对入队列,之后的搜索从nums1[i + 1]开始if (indexArray[i] == nums2.length) {startIndex = i + 1;continue;}// 比较,选择最小的if (nums1[i] + nums2[indexArray[i]] < min) {min = nums1[i] + nums2[indexArray[i]];currentIndex = i;}// nums1和nums2都升序,所以nums1[i] + nums2[a] <= nums1[nums1.length - 1] + nums2[a]if (indexArray[i] == indexArray[indexArray.length - 1]) {break;}}// 防止k > nums1.length * nums2.length,出现则直接跳出if (currentIndex == -1) {break;}// 最小的对入队List<Integer> data = new ArrayList<>();result.add(data);data.add(nums1[currentIndex]);data.add(nums2[indexArray[currentIndex]]);indexArray[currentIndex] = indexArray[currentIndex] + 1;}return result;}
}

Java实现 LeetCode 373 查找和最小的K对数字相关推荐

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

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

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

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

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

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

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

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

  5. 力扣 373. 查找和最小的K对数字

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

  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. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  9. 最小的k个数 java_【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...

最新文章

  1. APS:大型多模态室内摄像机定位系统
  2. 媒体洞察 | 让企业自由发展的云时代
  3. Leetcode290单词规律-map使用
  4. 用 Git 操作的数据库?这个项目火了!
  5. leetcode76. 最小覆盖子串
  6. Linux 服务器感染kerberods 病毒
  7. 06.Android之消息机制问题
  8. 基于voidAR实现增强现实之初音未来
  9. paip.常用汉字形声字大全3500字
  10. 一些有用软件收藏(更新中)
  11. python+django+mysql多用户B2C商城系统毕业设计毕设开题报告
  12. win10+ubuntu16双系统卸载流程及问题总结
  13. 融资租赁产品计算内部收益率IRR
  14. 什么是Cutoff Scores/Marks?
  15. 用SDK包开发K66FX18学习笔记(3)
  16. Vivo升级android版本,vivo手机升级Android Q教程:很简单,X27与NEX都支持
  17. python数据分析:客户价值分析案例实战
  18. 网络工程计算机文科可以报考么,文科生可以报考网络工程专业吗
  19. EDA软件_电路设计仿真软件比较
  20. 浙江工商大学python考试试卷_浙江工商大学期末考试试卷

热门文章

  1. 量子十问之三:量子技术能将人“瞬间”转移到别的星球上吗?
  2. 绿氢、蓝氢、灰氢,原来氢也可以这么出彩
  3. android单手操作系统,生命不息,折腾不止:在 Android 上自制单手模式
  4. 本科课程模糊综合评价系统设计与实现
  5. 【Liunx】Navicat连接ubuntu下mysql
  6. C/C++基本数据类型大小
  7. PyQt5制作简易桌面
  8. 获取手机设备型号、系统版本、手机型号等信息
  9. IS-IS LSP泛洪同步过程
  10. 全球及中国安防电源行业竞争状况及供需前景预测报告(新版)2022-2027