From d760370e038303e0d193e0d0032ad8e3c89ee99e Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Fri, 22 Nov 2024 17:22:56 +0800 Subject: [PATCH 1/2] feat(leetcode): add solutions for problem 3357 in C++, Java, and Python --- .../Solution.cpp | 53 +++++++++++++++++++ .../Solution.java | 51 ++++++++++++++++++ .../Solution.py | 21 ++++++++ 3 files changed, 125 insertions(+) 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.java 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/Solution.cpp b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp new file mode 100644 index 0000000000000..2cb7e5691cbb6 --- /dev/null +++ b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.cpp @@ -0,0 +1,53 @@ +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.java b/solution/3300-3399/3357.Minimize the Maximum Adjacent Element Difference/Solution.java new file mode 100644 index 0000000000000..99cc4a6afee34 --- /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)); + } +} 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..598290d699932 --- /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 3c31468d13a8beb552c4241c76b1eb9b608c191a Mon Sep 17 00:00:00 2001 From: Abdullah <134060614+rajaabdullah833@users.noreply.github.com> Date: Sat, 23 Nov 2024 13:44:07 +0000 Subject: [PATCH 2/2] fix: update solution for problem 3357 --- .../3300-3399/3356.Zero Array Transformation II/Solution.java | 1 - 1 file changed, 1 deletion(-) diff --git a/solution/3300-3399/3356.Zero Array Transformation II/Solution.java b/solution/3300-3399/3356.Zero Array Transformation II/Solution.java index b705906adbef8..ad624dc702516 100644 --- a/solution/3300-3399/3356.Zero Array Transformation II/Solution.java +++ b/solution/3300-3399/3356.Zero Array Transformation II/Solution.java @@ -28,7 +28,6 @@ boolean isValid(int maxDiff) { return true; } - // Binary search for the minimum maximum difference while (left <= right) { int mid = left + (right - left) / 2; if (isValid(mid)) {