1. 题目

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

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

2. 解题

  • 类似题目: LeetCode 5403. 有序矩阵中的第 k 个最小数组和 hard

上面链接5403题目是n行,本题是2行,本质并无区别

  • 每行一个指针,初始都位于最前面
  • 优先队列存储《和,指针1,指针2》,自定义和小的优先
  • 每次将堆顶的《指针对》取出,依次对每一行指针+1,数值变大一点
  • push进入优先队列(堆),重复以上过程k次
struct cmp
{bool operator()(vector<int>& a, vector<int>& b){return a[0] > b[0];//小顶堆,和小的在上面}
};
class Solution {public:vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {int i1 = 0, i2 = 0, n1 = nums1.size(), n2 = nums2.size();if(k > n1*n2) k = n1*n2;if(n1==0 || n2==0) return {};priority_queue<vector<int>, vector<vector<int>>, cmp> q;q.push({nums1[0]+nums2[0],0,0});//sum,i1,i2vector<vector<int>> ans;vector<vector<bool>> visited(n1,vector<bool>(n2,false));visited[0][0] = true;while(k--){i1 = q.top()[1];i2 = q.top()[2];ans.push_back({nums1[i1],nums2[i2]});q.pop();if(i1+1 < n1 && !visited[i1+1][i2]){q.push({nums1[i1+1]+nums2[i2],i1+1,i2});visited[i1+1][i2] = true;}if(i2+1 < n2 && !visited[i1][i2+1]){q.push({nums1[i1]+nums2[i2+1],i1,i2+1});visited[i1][i2+1] = true;}}return ans;}
};

20 ms 9.9 MB (本题数据量变大,上面解法失效)

  • 初始把 数组1 中的前 min(len(nums1), k) 个元素 和 nums2[0] 配对加入优先队列
  • 在优先队列内只需对 指针2 进行 +1 枚举
struct cmp
{bool operator()(vector<long long>& a, vector<long long>& b){return a[0] > b[0];}
};
class Solution {public:vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {int i1 = 0, i2 = 0, n1 = nums1.size(), n2 = nums2.size();if(k > 1LL*n1*n2) k = n1*n2;if(n1==0 || n2==0) return {};priority_queue<vector<long long>, vector<vector<long long>>, cmp> q;for (int i = 0; i < min(k, n1); i++) q.push({nums1[i]+nums2[0],i,0});//sum,i1,i2vector<vector<int>> ans;while(k--){i1 = q.top()[1];i2 = q.top()[2];ans.push_back({nums1[i1],nums2[i2]});q.pop();if(i2+1 < n2){q.push({nums1[i1]+nums2[i2+1],i1,i2+1});}}return ans;}
};

执行用时:100 ms, 在所有 C++ 提交中击败了52.91%的用户
2022.1.14

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

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

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

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

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

  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. LeetCode:面试题40. 最小的k个数

    40. 最小的k个数 题目: 解题思路: 源码: 题目: 解题思路: 1.快速排序: 2.堆排序: 详细解释看leetcode的官网 源码: int comp(void *a,void *b){int ...

  9. LeetCode 703. 数据流中的第K大元素(优先队列)

    1. 题目 设计一个找到数据流中第K大元素的类(class). 注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...

最新文章

  1. 实战:基于OpenCV的人眼检测
  2. 将多窗体应用程序改造为仿Chrome形式的简易方法
  3. 关于网管软件中的预警功能的发展
  4. 数据清洗最基础的10个问题,基本涵盖目前常见的数分场景!
  5. Resource is out of sync with the file system解决办法
  6. Java监控MongoDB空间使用量、连接数
  7. 一种经典的网络游戏服务器架构
  8. torchvision.transforms
  9. Linux下新手基本操作及技巧看图上路
  10. 工伤单险可以单独缴纳?或者是面对非全用工形式的员工是否可以缴纳工伤单险?
  11. 最新Handsome主题V6.0免授权版+Typecho内核
  12. 记录一下线上高并发情况下 SimpleDateFormat 出现异常问题【项目】
  13. 微信JSSDK invalid signature签名错误的解决方法
  14. 数据集fer2013
  15. 35,UC(14) .
  16. ue4 无效模拟选项:形体被设置为模拟物理,但启用碰撞不兼容
  17. bootstrap设置默认主题皮肤
  18. 金字塔(算法竞赛进阶指南)
  19. oracle部分符号含义
  20. 零基础学Arcgis(七)|空间数据采集与管理(4)数据检查

热门文章

  1. Linux基本操作【作业】
  2. import导入模块
  3. Halcon中OCR的实现及关键函数解析
  4. dedecms php5.4 无法退出后台,PHP5.4版本织梦dedecms后台退出空白的解决方法
  5. e480 黑苹果_Thinkpad E480黑苹果组建Fusion Drive——鱼和熊掌我都要
  6. C++起航篇——bool类型,输入输出,命名空间
  7. Android - Glide4.4.0使用
  8. Maven整合Spring3.0+Mybatis3.2+Struts2.3+查找坐标+jar包依赖(五)
  9. final个人阅读作业
  10. MySQL单机版Recycle Bin回收站功能