From 6a17812d9c515490e2cd1b6c504a65c7ddf6ffe2 Mon Sep 17 00:00:00 2001 From: Abdullah <134060614+rajaabdullah833@users.noreply.github.com> Date: Sat, 23 Nov 2024 02:30:16 +0500 Subject: [PATCH 1/7] 3357 Minimize the Maximum Adjacent Element Difference - SOLVED --- .../README_EN.md | 70 +++++++++++++++++-- .../Solution.cpp | 54 ++++++++++++++ .../Solution.py | 21 ++++++ 3 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp create mode 100644 solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md index b3c0b48d46ff0..99642ac5a532d 100644 --- a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md +++ b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md @@ -16,8 +16,6 @@ tags: ## Description - -

You are given an array of integers nums. Some values in nums are missing and are denoted by -1.

You can choose a pair of positive integers (x, y) exactly once and replace each missing element with either x or y.

@@ -88,12 +86,46 @@ tags: ### Solution 1 - +#### Approach: + +1. **Greedy Replacement Strategy**: + - Traverse the array and determine the missing (-1) positions. + - Identify the potential minimum and maximum values needed to replace the missing positions such that the absolute difference between adjacent elements is minimized. + - Use binary search to minimize the maximum absolute difference. + +2. **Binary Search for Optimization**: + - Apply binary search to determine the best pair `(x, y)` that minimizes the maximum adjacent difference. #### Python3 ```python - +def minimize_max_diff(nums): + def is_valid(max_diff, x, y): + prev = nums[0] if nums[0] != -1 else x + for i in range(1, len(nums)): + current = nums[i] + if current == -1: + current = x if abs(prev - x) <= max_diff else y + if abs(current - prev) > max_diff: + return False + prev = current + return True + + missing_positions = [i for i, val in enumerate(nums) if val == -1] + + left, right = 0, 10**9 + result = 10**9 + + while left <= right: + mid = (left + right) // 2 + x, y = mid, mid + 1 # Candidates for missing values + if is_valid(mid, x, y): + result = mid + right = mid - 1 + else: + left = mid + 1 + + return result ``` #### Java @@ -105,6 +137,36 @@ tags: #### C++ ```cpp +class Solution { +public: + int minimizeMaxDifference(vector& nums, int k) { + int n = nums.size(); + sort(nums.begin(), nums.end()); + + int l = 0, r = nums[n - 1] - nums[0]; + while (l < r) { + int mid = l + (r - l) / 2; + if (canMinimize(nums, k, mid)) { + r = mid; + } else { + l = mid + 1; + } + } + return l; + } + +private: + bool canMinimize(vector& nums, int k, int target) { + int ops = 0; + for (int i = 1; i < nums.size(); ++i) { + if (nums[i] - nums[i - 1] > target) { + ops += (nums[i] - nums[i - 1] - 1) / target; + if (ops > k) return false; + } + } + return true; + } +}; ``` diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp new file mode 100644 index 0000000000000..8a5b1926545c0 --- /dev/null +++ b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp @@ -0,0 +1,54 @@ +class Solution { +public: + int minimizeMaxDifference(vector& nums) { + int n = nums.size(); + int minVal = INT_MAX, maxVal = INT_MIN; + + for (int i = 0; i < n; ++i) { + if (nums[i] != -1) { + minVal = min(minVal, nums[i]); + maxVal = max(maxVal, nums[i]); + } + } + + if (minVal == INT_MAX) { + return 0; + } + + auto isPossible = [&](int maxDiff) -> bool { + int prev = -1; + + for (int i = 0; i < n; ++i) { + if (nums[i] != -1) { + prev = nums[i]; + } else { + + if (prev != -1) { + if (abs(prev - minVal) > maxDiff && abs(prev - maxVal) > maxDiff) { + return false; + } + prev = (abs(prev - minVal) <= abs(prev - maxVal)) ? minVal : maxVal; + } else { + prev = minVal; + } + } + } + + return true; + }; + + int left = 0, right = maxVal - minVal, result = right; + + while (left <= right) { + int mid = left + (right - left) / 2; + if (isPossible(mid)) { + result = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + + return result; + } +}; diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py new file mode 100644 index 0000000000000..21886de6ed3b3 --- /dev/null +++ b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py @@ -0,0 +1,21 @@ +class Solution: + def minimizeMaxDifference(self, nums: List[int], k: int) -> int: + nums.sort() + l, r = 0, nums[-1] - nums[0] + + def can_minimize(target): + ops = 0 + for i in range(1, len(nums)): + if nums[i] - nums[i - 1] > target: + ops += (nums[i] - nums[i - 1] - 1) // target + if ops > k: + return False + return True + + while l < r: + mid = (l + r) // 2 + if can_minimize(mid): + r = mid + else: + l = mid + 1 + return l From 398af7549012394732ab4db1afa91d0d65c39db1 Mon Sep 17 00:00:00 2001 From: Abdullah <134060614+rajaabdullah833@users.noreply.github.com> Date: Sat, 23 Nov 2024 02:35:30 +0500 Subject: [PATCH 2/7] 3357 Minimize the Maximum Adjacent Element Difference Solved in java --- .../README_EN.md | 48 +++++++++++++++++ .../Solution.java | 51 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md index 99642ac5a532d..0a382c6168358 100644 --- a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md +++ b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md @@ -131,7 +131,55 @@ def minimize_max_diff(nums): #### Java ```java +public class MinimizeMaxDifference { + public int minimizeMaxDiff(int[] nums) { + int left = 0, right = (int) 1e9, result = (int) 1e9; + + while (left <= right) { + int mid = left + (right - left) / 2; + if (isValid(nums, mid)) { + result = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + + return result; + } + + private boolean isValid(int[] nums, int maxDiff) { + int prev = nums[0] != -1 ? nums[0] : -1; + + for (int i = 1; i < nums.length; i++) { + int current = nums[i]; + if (current == -1) { + if (prev != -1) { + current = Math.max(prev - maxDiff, 1); // Ensure values are positive + } else { + current = 1; // Default to a positive value + } + } + if (prev != -1 && Math.abs(current - prev) > maxDiff) { + return false; + } + prev = current; + } + return true; + } + public static void main(String[] args) { + MinimizeMaxDifference solver = new MinimizeMaxDifference(); + int[] nums1 = {1, 2, -1, 10, 8}; + System.out.println(solver.minimizeMaxDiff(nums1)); // Output: 4 + + int[] nums2 = {-1, -1, -1}; + System.out.println(solver.minimizeMaxDiff(nums2)); // Output: 0 + + int[] nums3 = {-1, 10, -1, 8}; + System.out.println(solver.minimizeMaxDiff(nums3)); // Output: 1 + } +} ``` #### C++ diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java new file mode 100644 index 0000000000000..e18e5b7b9219c --- /dev/null +++ b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java @@ -0,0 +1,51 @@ +public class Solution { + + public int minimizeMaxDiff(int[] nums) { + int left = 0, right = (int) 1e9, result = (int) 1e9; + + while (left <= right) { + int mid = left + (right - left) / 2; + if (isValid(nums, mid)) { + result = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + + return result; + } + + private boolean isValid(int[] nums, int maxDiff) { + int prev = nums[0] != -1 ? nums[0] : -1; + + for (int i = 1; i < nums.length; i++) { + int current = nums[i]; + if (current == -1) { + if (prev != -1) { + current = Math.max(prev - maxDiff, 1); + } else { + current = 1; + } + } + if (prev != -1 && Math.abs(current - prev) > maxDiff) { + return false; + } + prev = current; + } + return true; + } + + public static void main(String[] args) { + Solution solver = new Solution(); + + int[] nums1 = {1, 2, -1, 10, 8}; + System.out.println(solver.minimizeMaxDiff(nums1)); + + int[] nums2 = {-1, -1, -1}; + System.out.println(solver.minimizeMaxDiff(nums2)); + + int[] nums3 = {-1, 10, -1, 8}; + System.out.println(solver.minimizeMaxDiff(nums3)); + } +} From a0dd1bbabf6b92aef859a78c4244cf8bc523c3fd Mon Sep 17 00:00:00 2001 From: rajaabdullah833 Date: Fri, 22 Nov 2024 21:43:34 +0000 Subject: [PATCH 3/7] style: format code and docs with prettier --- .../README_EN.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md index 0a382c6168358..aa01c7ffa400d 100644 --- a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md +++ b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md @@ -89,12 +89,13 @@ tags: #### Approach: 1. **Greedy Replacement Strategy**: - - Traverse the array and determine the missing (-1) positions. - - Identify the potential minimum and maximum values needed to replace the missing positions such that the absolute difference between adjacent elements is minimized. - - Use binary search to minimize the maximum absolute difference. + + - Traverse the array and determine the missing (-1) positions. + - Identify the potential minimum and maximum values needed to replace the missing positions such that the absolute difference between adjacent elements is minimized. + - Use binary search to minimize the maximum absolute difference. 2. **Binary Search for Optimization**: - - Apply binary search to determine the best pair `(x, y)` that minimizes the maximum adjacent difference. + - Apply binary search to determine the best pair `(x, y)` that minimizes the maximum adjacent difference. #### Python3 @@ -112,7 +113,7 @@ def minimize_max_diff(nums): return True missing_positions = [i for i, val in enumerate(nums) if val == -1] - + left, right = 0, 10**9 result = 10**9 @@ -190,7 +191,7 @@ public: int minimizeMaxDifference(vector& nums, int k) { int n = nums.size(); sort(nums.begin(), nums.end()); - + int l = 0, r = nums[n - 1] - nums[0]; while (l < r) { int mid = l + (r - l) / 2; From 1ec9aa35427ac8df234ef8ff36b31c85f86a8f07 Mon Sep 17 00:00:00 2001 From: Abdullah <134060614+rajaabdullah833@users.noreply.github.com> Date: Sat, 23 Nov 2024 03:08:34 +0500 Subject: [PATCH 4/7] Delete solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md --- .../README_EN.md | 232 ------------------ 1 file changed, 232 deletions(-) delete mode 100644 solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md deleted file mode 100644 index aa01c7ffa400d..0000000000000 --- a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/README_EN.md +++ /dev/null @@ -1,232 +0,0 @@ ---- -comments: true -difficulty: Hard -edit_url: https://github.com/doocs/leetcode/edit/main/solution/3300-3399/3357.Minimize%20the%20Maximum%20Adjacent%20Element%20Difference/README_EN.md -tags: - - Greedy - - Array - - Binary Search ---- - - - -# [3357. Minimize the Maximum Adjacent Element Difference](https://leetcode.com/problems/minimize-the-maximum-adjacent-element-difference) - -[中文文档](/solution/3300-3399/3357.Minimize%20the%20Maximum%20Adjacent%20Element%20Difference/README.md) - -## Description - -

You are given an array of integers nums. Some values in nums are missing and are denoted by -1.

- -

You can choose a pair of positive integers (x, y) exactly once and replace each missing element with either x or y.

- -

You need to minimize the maximum absolute difference between adjacent elements of nums after replacements.

- -

Return the minimum possible difference.

- -

 

-

Example 1:

- -
-

Input: nums = [1,2,-1,10,8]

- -

Output: 4

- -

Explanation:

- -

By choosing the pair as (6, 7), nums can be changed to [1, 2, 6, 10, 8].

- -

The absolute differences between adjacent elements are:

- -
    -
  • |1 - 2| == 1
  • -
  • |2 - 6| == 4
  • -
  • |6 - 10| == 4
  • -
  • |10 - 8| == 2
  • -
-
- -

Example 2:

- -
-

Input: nums = [-1,-1,-1]

- -

Output: 0

- -

Explanation:

- -

By choosing the pair as (4, 4), nums can be changed to [4, 4, 4].

-
- -

Example 3:

- -
-

Input: nums = [-1,10,-1,8]

- -

Output: 1

- -

Explanation:

- -

By choosing the pair as (11, 9), nums can be changed to [11, 10, 9, 8].

-
- -

 

-

Constraints:

- -
    -
  • 2 <= nums.length <= 105
  • -
  • nums[i] is either -1 or in the range [1, 109].
  • -
- - - -## Solutions - - - -### Solution 1 - -#### Approach: - -1. **Greedy Replacement Strategy**: - - - Traverse the array and determine the missing (-1) positions. - - Identify the potential minimum and maximum values needed to replace the missing positions such that the absolute difference between adjacent elements is minimized. - - Use binary search to minimize the maximum absolute difference. - -2. **Binary Search for Optimization**: - - Apply binary search to determine the best pair `(x, y)` that minimizes the maximum adjacent difference. - -#### Python3 - -```python -def minimize_max_diff(nums): - def is_valid(max_diff, x, y): - prev = nums[0] if nums[0] != -1 else x - for i in range(1, len(nums)): - current = nums[i] - if current == -1: - current = x if abs(prev - x) <= max_diff else y - if abs(current - prev) > max_diff: - return False - prev = current - return True - - missing_positions = [i for i, val in enumerate(nums) if val == -1] - - left, right = 0, 10**9 - result = 10**9 - - while left <= right: - mid = (left + right) // 2 - x, y = mid, mid + 1 # Candidates for missing values - if is_valid(mid, x, y): - result = mid - right = mid - 1 - else: - left = mid + 1 - - return result -``` - -#### Java - -```java -public class MinimizeMaxDifference { - public int minimizeMaxDiff(int[] nums) { - int left = 0, right = (int) 1e9, result = (int) 1e9; - - while (left <= right) { - int mid = left + (right - left) / 2; - if (isValid(nums, mid)) { - result = mid; - right = mid - 1; - } else { - left = mid + 1; - } - } - - return result; - } - - private boolean isValid(int[] nums, int maxDiff) { - int prev = nums[0] != -1 ? nums[0] : -1; - - for (int i = 1; i < nums.length; i++) { - int current = nums[i]; - if (current == -1) { - if (prev != -1) { - current = Math.max(prev - maxDiff, 1); // Ensure values are positive - } else { - current = 1; // Default to a positive value - } - } - if (prev != -1 && Math.abs(current - prev) > maxDiff) { - return false; - } - prev = current; - } - return true; - } - - public static void main(String[] args) { - MinimizeMaxDifference solver = new MinimizeMaxDifference(); - int[] nums1 = {1, 2, -1, 10, 8}; - System.out.println(solver.minimizeMaxDiff(nums1)); // Output: 4 - - int[] nums2 = {-1, -1, -1}; - System.out.println(solver.minimizeMaxDiff(nums2)); // Output: 0 - - int[] nums3 = {-1, 10, -1, 8}; - System.out.println(solver.minimizeMaxDiff(nums3)); // Output: 1 - } -} -``` - -#### C++ - -```cpp -class Solution { -public: - int minimizeMaxDifference(vector& nums, int k) { - int n = nums.size(); - sort(nums.begin(), nums.end()); - - int l = 0, r = nums[n - 1] - nums[0]; - while (l < r) { - int mid = l + (r - l) / 2; - if (canMinimize(nums, k, mid)) { - r = mid; - } else { - l = mid + 1; - } - } - return l; - } - -private: - bool canMinimize(vector& nums, int k, int target) { - int ops = 0; - for (int i = 1; i < nums.size(); ++i) { - if (nums[i] - nums[i - 1] > target) { - ops += (nums[i] - nums[i - 1] - 1) / target; - if (ops > k) return false; - } - } - return true; - } -}; - -``` - -#### Go - -```go - -``` - - - - - - From 3504bf1b8eb01fb5baa4d06a031e7ab6006b9088 Mon Sep 17 00:00:00 2001 From: Abdullah <134060614+rajaabdullah833@users.noreply.github.com> Date: Sat, 23 Nov 2024 03:10:35 +0500 Subject: [PATCH 5/7] Delete solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp --- .../Solution.cpp | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp deleted file mode 100644 index 8a5b1926545c0..0000000000000 --- a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp +++ /dev/null @@ -1,54 +0,0 @@ -class Solution { -public: - int minimizeMaxDifference(vector& nums) { - int n = nums.size(); - int minVal = INT_MAX, maxVal = INT_MIN; - - for (int i = 0; i < n; ++i) { - if (nums[i] != -1) { - minVal = min(minVal, nums[i]); - maxVal = max(maxVal, nums[i]); - } - } - - if (minVal == INT_MAX) { - return 0; - } - - auto isPossible = [&](int maxDiff) -> bool { - int prev = -1; - - for (int i = 0; i < n; ++i) { - if (nums[i] != -1) { - prev = nums[i]; - } else { - - if (prev != -1) { - if (abs(prev - minVal) > maxDiff && abs(prev - maxVal) > maxDiff) { - return false; - } - prev = (abs(prev - minVal) <= abs(prev - maxVal)) ? minVal : maxVal; - } else { - prev = minVal; - } - } - } - - return true; - }; - - int left = 0, right = maxVal - minVal, result = right; - - while (left <= right) { - int mid = left + (right - left) / 2; - if (isPossible(mid)) { - result = mid; - right = mid - 1; - } else { - left = mid + 1; - } - } - - return result; - } -}; From f331d70a8bd1e86264e9d0881682fefed3bf6a73 Mon Sep 17 00:00:00 2001 From: Abdullah <134060614+rajaabdullah833@users.noreply.github.com> Date: Sat, 23 Nov 2024 03:11:15 +0500 Subject: [PATCH 6/7] Delete solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py --- .../Solution.py | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py deleted file mode 100644 index 21886de6ed3b3..0000000000000 --- a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.py +++ /dev/null @@ -1,21 +0,0 @@ -class Solution: - def minimizeMaxDifference(self, nums: List[int], k: int) -> int: - nums.sort() - l, r = 0, nums[-1] - nums[0] - - def can_minimize(target): - ops = 0 - for i in range(1, len(nums)): - if nums[i] - nums[i - 1] > target: - ops += (nums[i] - nums[i - 1] - 1) // target - if ops > k: - return False - return True - - while l < r: - mid = (l + r) // 2 - if can_minimize(mid): - r = mid - else: - l = mid + 1 - return l From c4cd3db2e11485f812b88b946a3677c5850b0731 Mon Sep 17 00:00:00 2001 From: Abdullah <134060614+rajaabdullah833@users.noreply.github.com> Date: Sat, 23 Nov 2024 03:11:28 +0500 Subject: [PATCH 7/7] Delete solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java --- .../Solution.java | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java diff --git a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java deleted file mode 100644 index e18e5b7b9219c..0000000000000 --- a/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java +++ /dev/null @@ -1,51 +0,0 @@ -public class Solution { - - public int minimizeMaxDiff(int[] nums) { - int left = 0, right = (int) 1e9, result = (int) 1e9; - - while (left <= right) { - int mid = left + (right - left) / 2; - if (isValid(nums, mid)) { - result = mid; - right = mid - 1; - } else { - left = mid + 1; - } - } - - return result; - } - - private boolean isValid(int[] nums, int maxDiff) { - int prev = nums[0] != -1 ? nums[0] : -1; - - for (int i = 1; i < nums.length; i++) { - int current = nums[i]; - if (current == -1) { - if (prev != -1) { - current = Math.max(prev - maxDiff, 1); - } else { - current = 1; - } - } - if (prev != -1 && Math.abs(current - prev) > maxDiff) { - return false; - } - prev = current; - } - return true; - } - - public static void main(String[] args) { - Solution solver = new Solution(); - - int[] nums1 = {1, 2, -1, 10, 8}; - System.out.println(solver.minimizeMaxDiff(nums1)); - - int[] nums2 = {-1, -1, -1}; - System.out.println(solver.minimizeMaxDiff(nums2)); - - int[] nums3 = {-1, 10, -1, 8}; - System.out.println(solver.minimizeMaxDiff(nums3)); - } -}