Skip to content

Commit 6a17812

Browse files
3357 Minimize the Maximum Adjacent Element Difference - SOLVED
1 parent e7db871 commit 6a17812

File tree

3 files changed

+141
-4
lines changed

3 files changed

+141
-4
lines changed

solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ tags:
1616

1717
## Description
1818

19-
<!-- description:start -->
20-
2119
<p>You are given an array of integers <code>nums</code>. Some values in <code>nums</code> are <strong>missing</strong> and are denoted by -1.</p>
2220

2321
<p>You can choose a pair of <strong>positive</strong> integers <code>(x, y)</code> <strong>exactly once</strong> and replace each&nbsp;<strong>missing</strong> element with <em>either</em> <code>x</code> or <code>y</code>.</p>
@@ -88,12 +86,46 @@ tags:
8886

8987
### Solution 1
9088

91-
<!-- tabs:start -->
89+
#### Approach:
90+
91+
1. **Greedy Replacement Strategy**:
92+
- Traverse the array and determine the missing (-1) positions.
93+
- Identify the potential minimum and maximum values needed to replace the missing positions such that the absolute difference between adjacent elements is minimized.
94+
- Use binary search to minimize the maximum absolute difference.
95+
96+
2. **Binary Search for Optimization**:
97+
- Apply binary search to determine the best pair `(x, y)` that minimizes the maximum adjacent difference.
9298

9399
#### Python3
94100

95101
```python
96-
102+
def minimize_max_diff(nums):
103+
def is_valid(max_diff, x, y):
104+
prev = nums[0] if nums[0] != -1 else x
105+
for i in range(1, len(nums)):
106+
current = nums[i]
107+
if current == -1:
108+
current = x if abs(prev - x) <= max_diff else y
109+
if abs(current - prev) > max_diff:
110+
return False
111+
prev = current
112+
return True
113+
114+
missing_positions = [i for i, val in enumerate(nums) if val == -1]
115+
116+
left, right = 0, 10**9
117+
result = 10**9
118+
119+
while left <= right:
120+
mid = (left + right) // 2
121+
x, y = mid, mid + 1 # Candidates for missing values
122+
if is_valid(mid, x, y):
123+
result = mid
124+
right = mid - 1
125+
else:
126+
left = mid + 1
127+
128+
return result
97129
```
98130

99131
#### Java
@@ -105,6 +137,36 @@ tags:
105137
#### C++
106138

107139
```cpp
140+
class Solution {
141+
public:
142+
int minimizeMaxDifference(vector<int>& nums, int k) {
143+
int n = nums.size();
144+
sort(nums.begin(), nums.end());
145+
146+
int l = 0, r = nums[n - 1] - nums[0];
147+
while (l < r) {
148+
int mid = l + (r - l) / 2;
149+
if (canMinimize(nums, k, mid)) {
150+
r = mid;
151+
} else {
152+
l = mid + 1;
153+
}
154+
}
155+
return l;
156+
}
157+
158+
private:
159+
bool canMinimize(vector<int>& nums, int k, int target) {
160+
int ops = 0;
161+
for (int i = 1; i < nums.size(); ++i) {
162+
if (nums[i] - nums[i - 1] > target) {
163+
ops += (nums[i] - nums[i - 1] - 1) / target;
164+
if (ops > k) return false;
165+
}
166+
}
167+
return true;
168+
}
169+
};
108170

109171
```
110172
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
class Solution {
2+
public:
3+
int minimizeMaxDifference(vector<int>& nums) {
4+
int n = nums.size();
5+
int minVal = INT_MAX, maxVal = INT_MIN;
6+
7+
for (int i = 0; i < n; ++i) {
8+
if (nums[i] != -1) {
9+
minVal = min(minVal, nums[i]);
10+
maxVal = max(maxVal, nums[i]);
11+
}
12+
}
13+
14+
if (minVal == INT_MAX) {
15+
return 0;
16+
}
17+
18+
auto isPossible = [&](int maxDiff) -> bool {
19+
int prev = -1;
20+
21+
for (int i = 0; i < n; ++i) {
22+
if (nums[i] != -1) {
23+
prev = nums[i];
24+
} else {
25+
26+
if (prev != -1) {
27+
if (abs(prev - minVal) > maxDiff && abs(prev - maxVal) > maxDiff) {
28+
return false;
29+
}
30+
prev = (abs(prev - minVal) <= abs(prev - maxVal)) ? minVal : maxVal;
31+
} else {
32+
prev = minVal;
33+
}
34+
}
35+
}
36+
37+
return true;
38+
};
39+
40+
int left = 0, right = maxVal - minVal, result = right;
41+
42+
while (left <= right) {
43+
int mid = left + (right - left) / 2;
44+
if (isPossible(mid)) {
45+
result = mid;
46+
right = mid - 1;
47+
} else {
48+
left = mid + 1;
49+
}
50+
}
51+
52+
return result;
53+
}
54+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution:
2+
def minimizeMaxDifference(self, nums: List[int], k: int) -> int:
3+
nums.sort()
4+
l, r = 0, nums[-1] - nums[0]
5+
6+
def can_minimize(target):
7+
ops = 0
8+
for i in range(1, len(nums)):
9+
if nums[i] - nums[i - 1] > target:
10+
ops += (nums[i] - nums[i - 1] - 1) // target
11+
if ops > k:
12+
return False
13+
return True
14+
15+
while l < r:
16+
mid = (l + r) // 2
17+
if can_minimize(mid):
18+
r = mid
19+
else:
20+
l = mid + 1
21+
return l

0 commit comments

Comments
 (0)