• 查找和最小的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 }
  • 相关阅读:
    Qt编程之qrc文件的链接
    Visual Studio中的lib的链接顺序
    c++语言中的遍历
    转载:使用 OpenCV 识别 QRCode
    GreenOpenPaint的实现(四)放大缩小处理滚动事件
    GreenOpenPaint的实现(六)图片的保存和打开
    GreenOpenPaint的实现(五)矩形框
    GreenOpenPaint的实现(三)添加标尺
    GreenOpenPaint的实现(二)打开显示图片
    GreenOpenPaint的实现(一)基本框架
  • 原文地址:https://www.cnblogs.com/lancelee98/p/13262403.html
Copyright © 2020-2023  润新知