Skip to content

Commit d760370

Browse files
yanglbmerajaabdullah833
authored andcommitted
feat(leetcode): add solutions for problem 3357 in C++, Java, and Python
1 parent e7db871 commit d760370

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
if (prev != -1) {
26+
if (abs(prev - minVal) > maxDiff && abs(prev - maxVal) > maxDiff) {
27+
return false;
28+
}
29+
prev = (abs(prev - minVal) <= abs(prev - maxVal)) ? minVal : maxVal;
30+
} else {
31+
prev = minVal;
32+
}
33+
}
34+
}
35+
36+
return true;
37+
};
38+
39+
int left = 0, right = maxVal - minVal, result = right;
40+
41+
while (left <= right) {
42+
int mid = left + (right - left) / 2;
43+
if (isPossible(mid)) {
44+
result = mid;
45+
right = mid - 1;
46+
} else {
47+
left = mid + 1;
48+
}
49+
}
50+
51+
return result;
52+
}
53+
};
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
public class Solution {
2+
3+
public int minimizeMaxDiff(int[] nums) {
4+
int left = 0, right = (int) 1e9, result = (int) 1e9;
5+
6+
while (left <= right) {
7+
int mid = left + (right - left) / 2;
8+
if (isValid(nums, mid)) {
9+
result = mid;
10+
right = mid - 1;
11+
} else {
12+
left = mid + 1;
13+
}
14+
}
15+
16+
return result;
17+
}
18+
19+
private boolean isValid(int[] nums, int maxDiff) {
20+
int prev = nums[0] != -1 ? nums[0] : -1;
21+
22+
for (int i = 1; i < nums.length; i++) {
23+
int current = nums[i];
24+
if (current == -1) {
25+
if (prev != -1) {
26+
current = Math.max(prev - maxDiff, 1);
27+
} else {
28+
current = 1;
29+
}
30+
}
31+
if (prev != -1 && Math.abs(current - prev) > maxDiff) {
32+
return false;
33+
}
34+
prev = current;
35+
}
36+
return true;
37+
}
38+
39+
public static void main(String[] args) {
40+
Solution solver = new Solution();
41+
42+
int[] nums1 = {1, 2, -1, 10, 8};
43+
System.out.println(solver.minimizeMaxDiff(nums1));
44+
45+
int[] nums2 = {-1, -1, -1};
46+
System.out.println(solver.minimizeMaxDiff(nums2));
47+
48+
int[] nums3 = {-1, 10, -1, 8};
49+
System.out.println(solver.minimizeMaxDiff(nums3));
50+
}
51+
}
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)