두 개의 정렬된 배열 A1과 A2와 또 다른 값 k가 있다고 가정합니다. A1의 한 요소와 A2의 다른 요소로 구성된 쌍(u, v)을 정의해야 합니다. [(u1, v1), (u2, v2),…, (uk, vk)]와 같은 k 쌍을 찾아야 합니다. 따라서 A1 =[1, 7, 11]이고 A2 =[2, 4, 6]이고 k =3이면 출력은 [(1, 2), (1, 4), (1, 6)]이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 하나의 데이터 유형을 정의하고 두 개의 값과 b, 색인을 사용합니다.
- 유형 데이터의 키와 데이터 목록을 값으로 사용하는 하나의 우선 순위 대기열을 만듭니다.
- n :=A1 크기, m :=A2 크기
- n이 0이거나 m이 0이면 반환
- ret라는 행렬 하나 만들기
- 0 ~ n – 1 범위의 i에 대해
- 대기열에 데이터로 (A1[i], A2[0], 0) 삽입
- queue가 비어 있지 않고 k가 0이 아닌 경우
- curr :=큐 상단, 큐 요소 삭제
- curr의 first_val, curr의 second_val을 ret에 삽입
- curr의 인덱스 + 1
- (curr의 first_val, A2[curr의 인덱스 + 1], curr의 인덱스 + 1)이 있는 데이터를 대기열에 삽입
- k를 1 감소
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#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,],]