func smallestRangeII(nums []int, k int) int {
// 贪心:在排序后的数组中i下标处切一刀,左边小的这部分集体+k,右边大的部分集体-k
// 遍历寻找i点,使得新的max-min最小
n := len(nums)
sort.Ints(nums)
diff := nums[n-1] - nums[0] // 初始化也覆盖了一种情况,就是不切,所有数增加或减少k,差值不变
for i := 0; i < n-1; i++ {
curMax := max(nums[n-1]-k, nums[i]+k) // 在i点切,可能的最大值是原本的最大值nums[n-1]-k或者nums[i]+k
curMin := min(nums[0]+k, nums[i+1]-k) // 在i点切,可能的最小值值是原本的最小值nums[0+k或者nums[i+1]-k
diff = min(diff, curMax - curMin)
}
return diff
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
func min(x, y int) int {
if x < y {
return x
}
return y
}