Java实现 LeetCode 373 查找和最小的K对数字
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对数字相关推荐
- ⭐算法入门⭐《堆》中等03 —— LeetCode 373. 查找和最小的K对数字
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 给定两个以升序排列的整 ...
- LeetCode 373. 查找和最小的K对数字(自定义优先队列BFS)
1. 题目 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找到和最小的 k 对数 ...
- Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
解题思路: 使用最大堆来存储k个和最小的数组组合,然后每进来一个数组组合,只需要和最大堆的堆顶进行比较即可. 用C++的priority_queue实现最大堆时,需要用一下pair来组合来自nums1 ...
- 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)
文章目录 题目描述 思路 && 代码 题目描述 几天没打题,感觉脑子都是一团浆糊.... 升序:肯定得用这条件来优化复杂度 数对:用 int[2] 来表示 思路 && ...
- 力扣 373. 查找和最小的K对数字
题目 给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k . 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 . 请找到和最小的 k ...
- leetcode 373. Find K Pairs with Smallest Sums | 373. 查找和最小的K对数字(小根堆)
题目 https://leetcode.com/problems/find-k-pairs-with-smallest-sums/ 题解 本来以为是个双指针+贪心,但是后来发现如果用双指针的话,指针并 ...
- [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- 最小的k个数 java_【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...
最新文章
- APS:大型多模态室内摄像机定位系统
- 媒体洞察 | 让企业自由发展的云时代
- Leetcode290单词规律-map使用
- 用 Git 操作的数据库?这个项目火了!
- leetcode76. 最小覆盖子串
- Linux 服务器感染kerberods 病毒
- 06.Android之消息机制问题
- 基于voidAR实现增强现实之初音未来
- paip.常用汉字形声字大全3500字
- 一些有用软件收藏(更新中)
- python+django+mysql多用户B2C商城系统毕业设计毕设开题报告
- win10+ubuntu16双系统卸载流程及问题总结
- 融资租赁产品计算内部收益率IRR
- 什么是Cutoff Scores/Marks?
- 用SDK包开发K66FX18学习笔记(3)
- Vivo升级android版本,vivo手机升级Android Q教程:很简单,X27与NEX都支持
- python数据分析:客户价值分析案例实战
- 网络工程计算机文科可以报考么,文科生可以报考网络工程专业吗
- EDA软件_电路设计仿真软件比较
- 浙江工商大学python考试试卷_浙江工商大学期末考试试卷