-
Notifications
You must be signed in to change notification settings - Fork 0
/
2616-Minimize_the_Maximum_Difference_of_Pairs.cpp
132 lines (118 loc) · 3.49 KB
/
2616-Minimize_the_Maximum_Difference_of_Pairs.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*******************************************************************************
* 2616-Minimize_the_Maximum_Difference_of_Pairs.cpp
* Billy.Ljm
* 09 August 2023
*
* =======
* Problem
* =======
* https://leetcode.com/problems/minimize-the-maximum-difference-of-pairs/
*
* You are given a 0-indexed integer array nums and an integer p. Find p pairs
* of indices of nums such that the maximum difference amongst all the pairs is
* minimized. Also, ensure no index appears more than once amongst the p pairs.
*
* Note that for a pair of elements at the index i and j, the difference of this
* pair is |nums[i] - nums[j]|, where |x| represents the absolute value of x.
*
* Return the minimum maximum difference among all p pairs. We define the
* maximum of an empty set to be zero.
*
* ===========
* My Approach
* ===========
* We'll use binary search to search for the minimum threshold under which we
* can form p pairs. To find the number of pairs for a given threshold, we will
* sort the array and greedily pair adjacent numbers together.
*
* This has a time complexity of O(n log k), and a space complexity of O(1),
* where n and k is the length and maximum element of the array respectively.
******************************************************************************/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/**
* << operator for vectors
*/
template <typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
os << "[";
for (int i = 0; i < v.size(); i++) {
os << v[i] << ",";
}
os << "\b]";
return os;
}
/**
* Solution
*/
class Solution {
public:
/**
* Finds the number of pairs with distance under a threshold
*
* @param nums array of numbers sorted in ascending order
* @param threshold distance threshold under which numbers will be paired
* @return number of pairs with distance under threshold
*/
int numPairs(vector<int>& nums, int threshold) {
int npairs = 0;
int index = 1;
// try to pair adjacent numbers
// non-adjacent numbers have higher distances, and you'd never break up
// an adjacent pair for non-adjacent ones
while (index < nums.size()) {
if (nums[index] - nums[index - 1] <= threshold) {
npairs += 1;
index++; // increment index by 2
}
index++;
}
return npairs;
}
/**
* Finds the p pairs with the smallest maximum distance betwen pairs
*
* @param nums array of numbers to pair
* @param p number of pairs to form
* @return smallest maximum distance b/w pairs
*/
int minimizeMax(vector<int>& nums, int p) {
// sort for numPairs helper
sort(nums.begin(), nums.end());
// binary search for threshold distance
int start = 0, end = nums.back() - nums[0], mid;
while (end - start > 1) {
mid = start + (end - start) / 2;
if (numPairs(nums, mid) >= p) end = mid;
else start = mid;
}
// check last 2 possible thresholds
if (numPairs(nums, start) >= p) return start;
else return end;
}
};
/**
* Test cases
*/
int main(void) {
Solution sol;
vector<int> nums;
int p;
// test case 1
nums = { 10,1,2,7,1,3 };
p = 2;
std::cout << "minimizeMax(" << nums << "," << p << ") = ";
std::cout << sol.minimizeMax(nums, p) << std::endl;
// test case 2
nums = { 4,2,1,2 };
p = 1;
std::cout << "minimizeMax(" << nums << "," << p << ") = ";
std::cout << sol.minimizeMax(nums, p) << std::endl;
nums = { 10,1,2,7,1,3 };
p = 2;
std::cout << "minimizeMax(" << nums << "," << p << ") = ";
std::cout << sol.minimizeMax(nums, p) << std::endl;
return 0;
}