查找和最小的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,5,7
解释: 返回序列中的前 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
输出: 2, 2
解释: 返回序列中的前 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],所以输出4, 5
解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]
输入说明 :
首先输入nums1的长度n,然后输入n个整数
再输入nums2的长度m,然后输入m个整数
最后输入k
输出说明 :
按从小到大的顺序输出k对数字的和(注意:可能不足k对)
输入范例 :
3
1 7 11
3
2 4 6
3
输出范例 :
3 5 7
1 #include<iostream> 2 #include<map> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 //求前k小 用k个元素的大根堆 8 class Solution { 9 public: 10 struct Point 11 { 12 int x, y, sum; 13 Point(int _x, int _y) :x(_x), y(_y), sum(_x + _y) {}; 14 bool operator <(const Point& p)const 15 { 16 return sum < p.sum; 17 } 18 }; 19 vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { 20 priority_queue<Point> que; 21 for (auto x : nums1) 22 for (auto y : nums2) 23 { 24 que.push({ x,y }); 25 if (que.size() > k) que.pop(); 26 } 27 vector<vector<int> > res; 28 while (!que.empty()) 29 { 30 auto p = que.top(); 31 res.push_back({ p.x,p.y }); 32 que.pop(); 33 } 34 reverse(res.begin(), res.end()); 35 return res; 36 } 37 }; 38 int main() 39 { 40 int n, m, data, k; 41 vector<int> nums1, nums2; 42 cin >> n; 43 for (int i = 0; i < n; i++) 44 { 45 cin >> data; 46 nums1.push_back(data); 47 } 48 cin >> m; 49 for (int i = 0; i < m; i++) 50 { 51 cin >> data; 52 nums2.push_back(data); 53 } 54 cin >> k; 55 vector<vector<int> > res = Solution().kSmallestPairs(nums1, nums2, k); 56 for (int i = 0; i < res.size(); i++) 57 { 58 if (i > 0) 59 cout << " "; 60 cout << res[i][0] + res[i][1]; 61 } 62 return 0; 63 }