We want to minimize the maximum adjacent difference after filling all -1s with either x or y (chosen once). The best way is to try all possible values for x and y, and for each, use binary search to find the minimum possible maximum difference.
classSolution {
public:int minimizeMaxDiff(vector<int>& nums) {
int n = nums.size();
int mx =0;
for (int v : nums) if (v !=-1) mx = max(mx, v);
int ans = INT_MAX;
for (int x =1; x <= mx +1; ++x) {
for (int y = x; y <= mx +1; ++y) {
int lo =0, hi =1e9;
while (lo < hi) {
int mid = lo + (hi - lo) /2;
bool ok = true;
vector<int> arr = nums;
for (int i =0; i < n; ++i) {
if (arr[i] ==-1) {
int left = (i >0) ? arr[i-1] :-1;
int right = (i < n-1) ? arr[i+1] :-1;
int best =-1;
for (int v : {x, y}) {
bool valid = true;
if (left !=-1&& abs(left - v) > mid) valid = false;
if (right !=-1&& abs(right - v) > mid) valid = false;
if (valid) best = v;
}
if (best ==-1) { ok = false; break; }
arr[i] = best;
}
}
for (int i =1; i < n; ++i) {
if (abs(arr[i] - arr[i-1]) > mid) ok = false;
}
if (ok) hi = mid;
else lo = mid +1;
}
ans = min(ans, lo);
}
}
return ans;
}
};
classSolution {
publicintminimizeMaxDiff(int[] nums) {
int n = nums.length, mx = 0, ans = Integer.MAX_VALUE;
for (int v : nums) if (v !=-1) mx = Math.max(mx, v);
for (int x = 1; x <= mx + 1; ++x) {
for (int y = x; y <= mx + 1; ++y) {
int lo = 0, hi = (int)1e9;
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
int[] arr = nums.clone();
boolean ok =true;
for (int i = 0; i < n; ++i) {
if (arr[i]==-1) {
int left = (i > 0) ? arr[i-1] : -1;
int right = (i < n-1) ? arr[i+1] : -1;
int best =-1;
for (int v2 : newint[]{x, y}) {
boolean valid =true;
if (left !=-1 && Math.abs(left - v2) > mid) valid =false;
if (right !=-1 && Math.abs(right - v2) > mid) valid =false;
if (valid) best = v2;
}
if (best ==-1) { ok =false; break; }
arr[i]= best;
}
}
for (int i = 1; i < n; ++i) {
if (Math.abs(arr[i]- arr[i-1]) > mid) ok =false;
}
if (ok) hi = mid;
else lo = mid + 1;
}
ans = Math.min(ans, lo);
}
}
return ans;
}
}
classSolution {
funminimizeMaxDiff(nums: IntArray): Int {
val n = nums.size
var mx = 0for (v in nums) if (v != -1) mx = maxOf(mx, v)
var ans = Int.MAX_VALUE
for (x in1..mx+1) {
for (y in x..mx+1) {
var lo = 0var hi = 1_000_000_000
while (lo < hi) {
val mid = lo + (hi-lo)/2val arr = nums.copyOf()
var ok = truefor (i in0 until n) {
if (arr[i] == -1) {
val left = if (i > 0) arr[i-1] else -1val right = if (i < n-1) arr[i+1] else -1var best = -1for (v2 in listOf(x, y)) {
var valid = trueif (left != -1&& abs(left-v2) > mid) valid = falseif (right != -1&& abs(right-v2) > mid) valid = falseif (valid) best = v2
}
if (best == -1) { ok = false; break }
arr[i] = best
}
}
for (i in1 until n) {
if (abs(arr[i]-arr[i-1]) > mid) ok = false }
if (ok) hi = mid
else lo = mid + 1 }
ans = minOf(ans, lo)
}
}
return ans
}
funabs(x: Int) = if (x < 0) -x else x
}
defminimize_max_adjacent_diff(nums: list[int]) -> int:
n = len(nums)
mx = max((v for v in nums if v !=-1), default=1)
ans = float('inf')
for x in range(1, mx+2):
for y in range(x, mx+2):
lo, hi =0, int(1e9)
while lo < hi:
mid = (lo + hi) //2 arr = nums[:]
ok =Truefor i in range(n):
if arr[i] ==-1:
left = arr[i-1] if i >0else-1 right = arr[i+1] if i < n-1else-1 best =-1for v in (x, y):
valid =Trueif left !=-1and abs(left-v) > mid:
valid =Falseif right !=-1and abs(right-v) > mid:
valid =Falseif valid:
best = v
if best ==-1:
ok =Falsebreak arr[i] = best
for i in range(1, n):
if abs(arr[i]-arr[i-1]) > mid:
ok =Falseif ok:
hi = mid
else:
lo = mid +1 ans = min(ans, lo)
return ans
impl Solution {
pubfnminimize_max_adjacent_diff(nums: Vec<i32>) -> i32 {
let n = nums.len();
let mx = nums.iter().filter(|&&v| v !=-1).max().cloned().unwrap_or(1);
letmut ans =i32::MAX;
for x in1..=mx+1 {
for y in x..=mx+1 {
letmut lo =0;
letmut hi =1_000_000_000;
while lo < hi {
let mid = lo + (hi-lo)/2;
letmut arr = nums.clone();
letmut ok =true;
for i in0..n {
if arr[i] ==-1 {
let left =if i >0 { arr[i-1] } else { -1 };
let right =if i < n-1 { arr[i+1] } else { -1 };
letmut best =-1;
for&v in&[x, y] {
letmut valid =true;
if left !=-1&& (left-v).abs() > mid { valid =false; }
if right !=-1&& (right-v).abs() > mid { valid =false; }
if valid { best = v; }
}
if best ==-1 { ok =false; break; }
arr[i] = best;
}
}
for i in1..n {
if (arr[i]-arr[i-1]).abs() > mid { ok =false; }
}
if ok { hi = mid; } else { lo = mid+1; }
}
if lo < ans { ans = lo; }
}
}
ans
}
}