leetcode373查找和最小的k对数字(优先队列)

    科技2022-07-13  132

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

    思路: 当要求前K小或者前K大,都利用优先队列

    代码如下:

    class Solution { public: struct cmp{ bool operator()(pair<int,int>a,pair<int,int>b){ return a.first+a.second<b.first+b.second; } }; vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { priority_queue<pair<int,int>,vector<pair<int,int>>,cmp>q; vector<vector<int>>res; for(int i=0;i<nums1.size();i++){ for(int j=0;j<nums2.size();j++){ if(q.size()<k){ q.push({nums1[i],nums2[j]}); } else if(nums1[i]+nums2[j]<q.top().first+q.top().second){ q.pop(); q.push({nums1[i],nums2[j]}); } } } while(!q.empty()){ pair<int,int>top=q.top(); res.push_back({top.first,top.second}); q.pop(); } return res; } };
    Processed: 0.010, SQL: 8