
2025-06-09:最小化相邻元素的最大差值。用go语言,给定一个整数数组 nums,其中部分元素被标记为 -1,表示这些元素缺失。
你需要选取一对正整数 (x, y),将数组中所有 -1 替换为这两个数字之一。
目标是使替换后数组中任意相邻元素之间绝对差的最大值最小化。
请你计算并返回这个最小的最大绝对差值。
2 <= nums.length <= 100000。
nums[i] 要么是 -1 ,要么是范围 [1, 1000000000] 中的一个整数。
输入:nums = [1,2,-1,10,8]。
输出:4。
解释:
选择数对 (6, 7) ,nums 变为 [1, 2, 6, 10, 8] 。
相邻元素的绝对差值分别为: |1 - 2| == 1 |2 - 6| == 4 |6 - 10| == 4 |10 - 8| == 2
题目来自力扣3357。
package main
import (
"fmt"
"math"
)
func minDifference(nums []int) (ans int) {
n := len(nums)
// 和空位相邻的最小数字 minL 和最大数字 maxR
minL, maxR := math.MaxInt, 0
for i, v := range nums {
if v != -1 && (i > 0 && nums[i-1] == -1 || i < n-1 && nums[i+1] == -1) {
minL = min(minL, v)
maxR = max(maxR, v)
}
}
updateAns := func(l, r int, big bool) {
d := (min(r-minL, maxR-l) + 1) / 2
if big {
d = min(d, (maxR-minL+2)/3) // d 不能超过上界
}
ans = max(ans, d)
}
preI := -1
for i, v := range nums {
if v == -1 {
continue
}
if preI >= 0 {
if i-preI == 1 {
ans = max(ans, abs(v-nums[preI]))
} else {
updateAns(min(nums[preI], v), max(nums[preI], v), i-preI > 2)
}
} elseif i > 0 {
updateAns(v, v, false)
}
preI = i
}
if0 <= preI && preI < n-1 {
updateAns(nums[preI], nums[preI], false)
}
return
}
func abs(x int)int {
if x < 0 {
return -x
}
return x
}
func main() {
nums := []int{1, 2, -1, 10, 8}
fmt.Println(minDifference(nums))
}

.
# -*-coding:utf-8-*-
import math
from typing import List
def min_difference(nums: List[int]) -> int:
n = len(nums)
minL, maxR = math.inf, 0
def min_val(a, b):
return a if a < b else b
def max_val(a, b):
return a if a > b else b
def abs_val(x):
return x if x >= 0else -x
# 找和空位相邻的最小数字minL和最大数字maxR
for i, v in enumerate(nums):
if v != -1 and ((i > 0 and nums[i-1] == -1) or (i < n - 1 and nums[i + 1] == -1)):
minL = min_val(minL, v)
maxR = max_val(maxR, v)
ans = 0
def updateAns(l, r, big):
nonlocal ans
d = (min_val(r - minL, maxR - l) + 1) // 2
if big:
d = min_val(d, (maxR - minL + 2) // 3)
ans = max_val(ans, d)
preI = -1
for i, v in enumerate(nums):
if v == -1:
continue
if preI >= 0:
if i - preI == 1:
ans = max_val(ans, abs_val(v - nums[preI]))
else:
updateAns(min_val(nums[preI], v), max_val(nums[preI], v), i - preI > 2)
else:
if i > 0:
updateAns(v, v, False)
preI = i
if0 <= preI < n - 1:
updateAns(nums[preI], nums[preI], False)
return ans
if __name__ == '__main__':
nums = [1, 2, -1, 10, 8]
print(min_difference(nums))
我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大大架构师每日一题”,让 Go 语言和算法助力您的职业发展