问题描述 :
给定两个以升序排列的整形数组 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 }