C++中查找K对最小和


假设我们有两个已排序的数组A1和A2,以及另一个值k。我们必须定义一个对(u, v),它由A1中的一个元素和A2中的另一个元素组成。我们必须找到k个这样的对,例如[(u1, v1), (u2, v2),…, (uk, vk)]。因此,如果A1 = [1, 7, 11]且A2 = [2, 4, 6],k = 3,则输出将为[(1, 2), (1, 4), (1, 6)]

为了解决这个问题,我们将遵循以下步骤:

  • 定义一种数据类型,它将包含两个值a和b,以及索引。
  • 创建一个优先队列,它将采用数据类型的键和数据的列表作为值。
  • n := A1的大小,m := A2的大小
  • 如果n为0或m为0,则返回。
  • 创建一个名为ret的矩阵。
  • 对于范围从0到n-1的i
    • 将(A1[i], A2[0], 0)作为数据插入队列。
  • 当队列不为空且k不为0时
    • curr := 队列的顶部,删除队列元素。
    • 将curr的第一个值和第二个值插入ret。
    • 如果curr的索引+1 < m,则
      • 将数据(curr的第一个值, A2[curr的索引+1], curr的索引+1)插入队列。
    • k减1。
  • 返回ret。

让我们看看下面的实现,以便更好地理解:

示例

在线演示

#include <bits/stdc++.h>
#include <stack>
using namespace std;
struct Data{
   int firstVal, secondVal, idx;
   Data(int a, int b, int c){
      firstVal = a;
      secondVal = b;
      idx = c;
   }
};
struct Comparator{
   bool operator()(Data a, Data b){
      return !(a.firstVal + a.secondVal < b.firstVal + b.secondVal);
   }
};
class Solution {
   public:
   vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
      priority_queue <Data, vector <Data>, Comparator> pq;
      int n = nums1.size();
      int m = nums2.size();
      if(!n || !m)return {};
      vector < vector <int> > ret;
      for(int i = 0; i < n; i++){
         pq.push(Data(nums1[i], nums2[0], 0));
      }
      while(!pq.empty() && k--){
         Data curr = pq.top();
         pq.pop();
         ret.push_back({curr.firstVal, curr.secondVal});
         if(curr.idx + 1 < m){
            pq.push(Data(curr.firstVal, nums2[curr.idx + 1], curr.idx + 1));
         }
      }
      return ret;
   }
};
void print(vector <int> const &arr) {
   cout<<"[";
   for(int i=0; i < arr.size(); i++)
      std::cout << arr.at(i) <<",";
   cout<<"]";
}
int main() {
   vector<int> nums1{1,7,11};
   vector<int> nums2{2,4,6};
   int k = 3;
   Solution ob1;
   vector<vector<int>> numsRet;
   numsRet = ob1.kSmallestPairs(nums1, nums2, k);
   cout<<"[";
   for (vector<int> x : numsRet) {
      print(x);
      cout<<",";
   }
   cout<<"]"<<endl;
   return 0;
}

输入

[1,7,11]
[2,4,6]
3
vector<int> nums1{1,7,11};
vector<int> nums2{2,4,6};
int k = 3;
Solution ob1;
vector<vector<int>> numsRet;
numsRet = ob1.kSmallestPairs(nums1, nums2, k);

输出

[[1,2,],[1,4,],[1,6,],]

更新于:2020年4月29日

143 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告