码迷,mamicode.com
首页 > 其他好文 > 详细

查找和最小的K对数字

时间:2020-07-07 19:28:46      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:str   ble   lead   inpu   problems   public   map   tput   class   

问题描述 :

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

 

查找和最小的K对数字

标签:str   ble   lead   inpu   problems   public   map   tput   class   

原文地址:https://www.cnblogs.com/lancelee98/p/13262403.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!