forked from wisdompeak/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path373.Find-K-Pairs-with-Smallest-Sums_v2.cpp
53 lines (49 loc) · 1.49 KB
/
373.Find-K-Pairs-with-Smallest-Sums_v2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Solution {
public:
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k)
{
long left = INT_MIN, right = INT_MAX;
while (left < right)
{
long mid = left+(right-left)/2;
long count = countSmallerOrEqual(mid, nums1, nums2);
if (count < k)
left = mid+1;
else
right = mid;
}
int m = left;
// TODO-TLE: nums1 = [1] * 100000, nums2 = [1] * 100000, k = 2
vector<vector<int>>rets;
for (int i=0; i<nums1.size(); i++)
{
for (int j = 0; j<nums2.size() && nums1[i]+nums2[j]<m; j ++)
{
rets.push_back({nums1[i], nums2[j]});
}
}
// 316ms/11.89% -> 148ms/43.01%
for (int i=0; i<nums1.size(); i++)
{
for (int j = 0; j<nums2.size() && nums1[i]+nums2[j]<=m && rets.size() < k; j ++)
{
if (nums1[i]+nums2[j]==m) {
rets.push_back({nums1[i], nums2[j]});
}
}
}
return rets;
}
long countSmallerOrEqual(int m, vector<int>& nums1, vector<int>& nums2)
{
int j = nums2.size()-1;
long ret = 0;
for (int i=0; i<nums1.size(); i++)
{
while (j>=0 && nums1[i]+nums2[j]>m)
j--;
ret += j+1;
}
return ret;
}
};