Skip to content

Commit abb3a7b

Browse files
Yubo LiuYubo Liu
authored andcommitted
0373 solved.
1 parent e81c2ac commit abb3a7b

File tree

5 files changed

+243
-1
lines changed

5 files changed

+243
-1
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ Thumbs.db
1919
#####################
2020
*.gch
2121
*.out
22+
Cmake-build-debug/
23+
Cmake-build-release/
2224

2325
##########################
2426
# Jetbrains Ignore files #
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
project(0373_Find_K_Pairs_with_Smallest_Sums)
3+
4+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
5+
6+
set(SOURCE_FILES main.cpp)
7+
add_executable(0373_Find_K_Pairs_with_Smallest_Sums ${SOURCE_FILES})
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/// Source : https://leetcode.com/problems/find-k-pairs-with-smallest-sums/
2+
/// Author : liuyubobobo
3+
/// Time : 2018-11-09
4+
5+
#include <iostream>
6+
#include <vector>
7+
#include <queue>
8+
9+
using namespace std;
10+
11+
12+
/// Using Priority Queue
13+
/// Time Complexity: O(k * log(len(nums1)))
14+
/// Space Complexity: O(len(nums1))
15+
class Solution {
16+
public:
17+
vector<pair<int, int>> kSmallestPairs(
18+
vector<int>& nums1, vector<int>& nums2, int k) {
19+
20+
if(!nums1.size() || !nums2.size())
21+
return {};
22+
23+
vector<pair<int, int>> res;
24+
priority_queue<pair<int, pair<int, int>>,
25+
vector<pair<int, pair<int, int>>>,
26+
greater<pair<int, pair<int, int>>>> pq;
27+
for(int i = 0; i < nums1.size(); i ++)
28+
pq.push(make_pair(nums1[i] + nums2[0], make_pair(i, 0)));
29+
30+
while(k-- && !pq.empty()){
31+
pair<int, int> p = pq.top().second;
32+
33+
res.push_back(make_pair(nums1[p.first], nums2[p.second]));
34+
pq.pop();
35+
36+
if(p.second + 1 < nums2.size()){
37+
p.second ++;
38+
pq.push(make_pair(nums1[p.first] + nums2[p.second], p));
39+
}
40+
}
41+
42+
return res;
43+
}
44+
};
45+
46+
47+
void print_vec(const vector<pair<int, int>>& vec){
48+
for(const pair<int, int>& p: vec)
49+
cout << "(" << p.first << "," << p.second << ") ";
50+
cout << endl;
51+
}
52+
53+
int main() {
54+
55+
vector<int> A1 = {1, 7, 11};
56+
vector<int> B1 = {2, 4, 6};
57+
print_vec(Solution().kSmallestPairs(A1, B1, 3));
58+
// (1, 2) (1, 4) (1, 6)
59+
60+
vector<int> A2 = {1, 1, 2};
61+
vector<int> B2 = {1, 2, 3};
62+
print_vec(Solution().kSmallestPairs(A2, B2, 2));
63+
// (1, 1) (1, 1)
64+
65+
vector<int> A3 = {1, 2};
66+
vector<int> B3 = {3};
67+
print_vec(Solution().kSmallestPairs(A3, B3, 3));
68+
// (1, 3) (2, 3)
69+
70+
vector<int> A4 = {1, 1, 2};
71+
vector<int> B4 = {1, 2, 3};
72+
print_vec(Solution().kSmallestPairs(A4, B4, 10));
73+
// (1, 1) (1, 1) (2, 1) (1, 2) (1, 2) (2, 2) (1, 3) (1, 3) (2, 3)
74+
75+
vector<int> A5 = {1, 2, 4};
76+
vector<int> B5 = {-1, 1, 2};
77+
print_vec(Solution().kSmallestPairs(A5, B5, 100));
78+
// (1, -1) (2, -1) (1, 1) (4, -1) (2, 1) (1, 2) (2, 2) (4, 1) (4, 2)
79+
80+
vector<int> A6 = {-10, -4, 0, 0, 6};
81+
vector<int> B6 = {3, 5, 6, 7, 8, 100};
82+
print_vec(Solution().kSmallestPairs(A6, B6, 10));
83+
// (-10, 3) (-10, 5) (-10, 6) (-10, 7) (-10, 8) (-4, 3) (-4, 5) (-4, 6) (-4, 7) (0, 3)
84+
85+
return 0;
86+
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/// Source : https://leetcode.com/problems/find-k-pairs-with-smallest-sums/
2+
/// Author : liuyubobobo
3+
/// Time : 2018-11-10
4+
5+
#include <iostream>
6+
#include <vector>
7+
#include <cassert>
8+
9+
using namespace std;
10+
11+
12+
/// Using Binary Search
13+
/// Time Complexity: O(nums1 * log(nums2) * log(maxnum))
14+
/// Space Complexity: O(1)
15+
class Solution {
16+
public:
17+
vector<pair<int, int>> kSmallestPairs(
18+
vector<int>& nums1, vector<int>& nums2, int k) {
19+
20+
if(nums1.size() == 0 || nums2.size() == 0)
21+
return {};
22+
23+
int low = nums1[0] + nums2[0], high = nums1.back() + nums2.back();
24+
while(low != high){
25+
int mid = low + high;
26+
if(mid >= 0 || mid % 2 == 0) mid /= 2;
27+
else mid = (mid - 1) / 2; // very tricky here!
28+
// since C++ doesn't make floor division for minus number!
29+
30+
int num = get_num(nums1, nums2, mid);
31+
if(num >= k)
32+
high = mid;
33+
else
34+
low = mid + 1;
35+
}
36+
37+
return get_res(nums1, nums2, low, k);
38+
}
39+
40+
private:
41+
vector<pair<int, int>> get_res(const vector<int>& nums1, const vector<int>& nums2, int sum, int k){
42+
43+
vector<pair<int, int>> res;
44+
for(int e1: nums1){
45+
for(int e2: nums2)
46+
if(e1 + e2 < sum)
47+
res.push_back(make_pair(e1, e2));
48+
else
49+
break;
50+
}
51+
52+
sort(res.begin(), res.end(),
53+
[nums1, nums2](const pair<int, int>& p1, const pair<int, int>& p2){
54+
55+
int sum1 = p1.first + p1.second;
56+
int sum2 = p2.first + p2.second;
57+
if(sum1 != sum2)
58+
return sum1 < sum2;
59+
return p1 < p2;
60+
});
61+
62+
if(res.size() > k){
63+
while(res.size() > k)
64+
res.pop_back();
65+
}
66+
else
67+
for(int e1: nums1){
68+
int l = lower_bound(nums2.begin(), nums2.end(), sum - e1) - nums2.begin();
69+
if(l >= 0 && l < nums2.size())
70+
while(l < nums2.size() && nums2[l] == sum - e1 && res.size() < k)
71+
res.push_back(make_pair(e1, nums2[l++]));
72+
if(res.size() == k)
73+
break;
74+
}
75+
76+
return res;
77+
}
78+
79+
int get_num(const vector<int>& nums1, const vector<int>& nums2, int sum){
80+
81+
int num = 0;
82+
for(int e: nums1)
83+
if(e + nums2[0] <= sum){
84+
int index = lower_bound(nums2.begin(), nums2.end(), sum - e) - nums2.begin();
85+
if(nums2[index] > sum - e)
86+
index --;
87+
num += index + 1;
88+
}
89+
90+
return num;
91+
}
92+
};
93+
94+
95+
void print_vec(const vector<pair<int, int>>& vec){
96+
for(const pair<int, int>& p: vec)
97+
cout << "(" << p.first << "," << p.second << ") ";
98+
cout << endl;
99+
}
100+
101+
int main() {
102+
103+
vector<int> A1 = {1, 7, 11};
104+
vector<int> B1 = {2, 4, 6};
105+
print_vec(Solution().kSmallestPairs(A1, B1, 3));
106+
// (1, 2) (1, 4) (1, 6)
107+
108+
vector<int> A2 = {1, 1, 2};
109+
vector<int> B2 = {1, 2, 3};
110+
print_vec(Solution().kSmallestPairs(A2, B2, 2));
111+
// (1, 1) (1, 1)
112+
113+
vector<int> A3 = {1, 2};
114+
vector<int> B3 = {3};
115+
print_vec(Solution().kSmallestPairs(A3, B3, 3));
116+
// (1, 3) (2, 3)
117+
118+
vector<int> A4 = {1, 1, 2};
119+
vector<int> B4 = {1, 2, 3};
120+
print_vec(Solution().kSmallestPairs(A4, B4, 10));
121+
// (1, 1) (1, 1) (2, 1) (1, 2) (1, 2) (2, 2) (1, 3) (1, 3) (2, 3)
122+
123+
vector<int> A5 = {1, 2, 4};
124+
vector<int> B5 = {-1, 1, 2};
125+
print_vec(Solution().kSmallestPairs(A5, B5, 100));
126+
// (1, -1) (2, -1) (1, 1) (4, -1) (2, 1) (1, 2) (2, 2) (4, 1) (4, 2)
127+
128+
vector<int> A6 = {-10, -4, 0, 0, 6};
129+
vector<int> B6 = {3, 5, 6, 7, 8, 100};
130+
print_vec(Solution().kSmallestPairs(A6, B6, 10));
131+
// (-10, 3) (-10, 5) (-10, 6) (-10, 7) (-10, 8) (-4, 3) (-4, 5) (-4, 6) (-4, 7) (0, 3)
132+
133+
vector<int> A7 = {1,2,4,5,6};
134+
vector<int> B7 = {3,5,7,9};
135+
print_vec(Solution().kSmallestPairs(A7, B7, 10));
136+
137+
vector<int> A8 = {3,22,35,56,76};
138+
vector<int> B8 = {3,22,35,56,76};
139+
print_vec(Solution().kSmallestPairs(A8, B8, 25));
140+
141+
vector<int> A9 = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
142+
vector<int> B9 = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
143+
print_vec(Solution().kSmallestPairs(A9, B9, 1000));
144+
145+
return 0;
146+
}

readme.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ email: [liuyubobobo@gmail.com](mailto:liuyubobobo@gmail.com)
301301
| | | | | | |
302302
| 370 | [Range Addition](https://leetcode.com/problems/range-addition/description/) | | [C++](0370-Range-Addition/cpp-0370/) | | |
303303
| | | | | | |
304+
| 373 | [Find K Pairs with Smallest Sums](https://leetcode.com/problems/find-k-pairs-with-smallest-sums/) | [] | [C++](0373-Find-K-Pairs-with-Smallest-Sums/cpp-0373/) | | |
304305
| 374 | [Guess Number Higher or Lower](https://leetcode.com/problems/guess-number-higher-or-lower/description/) | [solution](https://leetcode.com/problems/guess-number-higher-or-lower/solution/) | [C++](0374-Guess-Number-Higher-or-Lower/cpp-0374/) | | |
305306
| | | | | | |
306307
| 377 | [Combination Sum IV](https://leetcode.com/problems/combination-sum-iv/description/) | [] | [C++](0377-Combination-Sum-IV/cpp-0377/) | | |
@@ -566,7 +567,7 @@ email: [liuyubobobo@gmail.com](mailto:liuyubobobo@gmail.com)
566567
| 910 | [Smallest Range II](https://leetcode.com/problems/smallest-range-ii/description/) | [solution](https://leetcode.com/problems/smallest-range-ii/solution/) | [C++](0910-Smallest-Range-II/cpp-0910/) | | |
567568
| 911 | [Online Election](https://leetcode.com/problems/online-election/description/) | [solution](https://leetcode.com/problems/online-election/solution/) | [C++](0911-Online-Election/cpp-0911/) | | |
568569
| | | | | | |
569-
| 913 | [Cat and Mouse Game](https://leetcode.com/problems/cat-and-mouse/) | [solution](https://leetcode.com/problems/cat-and-mouse/solution/) | [C++](0913-Cat-and-Mouse-Game/cpp-0913/) | | |
570+
| 913 | [Cat and Mouse Game](https://leetcode.com/problems/cat-and-mouse/) | [solution](https://leetcode.com/problems/cat-and-mouse/solution/)<br/>[缺:DFS拓扑排序;DP] | [C++](0913-Cat-and-Mouse-Game/cpp-0913/) | | |
570571
| 914 | [X of a Kind in a Deck of Cards](https://leetcode.com/problems/x-of-a-kind-in-a-deck-of-cards/description/) | [solution](https://leetcode.com/problems/x-of-a-kind-in-a-deck-of-cards/solution/) | [C++](0914-X-of-a-Kind-in-a-Deck-of-Cards/cpp-0914/) | | |
571572
| 915 | [Partition Array into Disjoint Intervals](https://leetcode.com/problems/partition-array-into-disjoint-intervals/description/) | [solution](https://leetcode.com/problems/partition-array-into-disjoint-intervals/solution/) | [C++](0915-Partition-Array-into-Disjoint-Intervals/cpp-0915/) | | |
572573
| 916 | [Word Subsets](https://leetcode.com/problems/word-subsets/description/) | [solution](https://leetcode.com/problems/word-subsets/solution/) | [C++](0916-Word-Subsets/cpp-0916/) | | |

0 commit comments

Comments
 (0)