题目
给你一个整数数组 nums,和一个整数 k 。
在一个操作中,您可以选择0 <= i < nums.length
的任何索引 i 。将nums[i]
改为nums[i] + x
,其中 x 是一个范围为 [ − k , k ] [-k, k] [−k,k] 的整数。对于每个索引 i ,最多 只能 应用 一次 此操作。
nums 的 分数 是 nums 中最大和最小元素的差值。
在对 nums 中的每个索引最多应用一次上述操作后,返回 nums 的最低 分数 。
思路
假设数组已经排序完成,由分数的定义知最低分一定是使用 最小数与最大数计算得出。最小数 m i n min min 的浮动区间为 [ m i n − k , m i n + k ] [min-k, min+k] [min−k,min+k],最大数 m a x max max 浮动区间为 [ m a x − k , m a x + k ] [max-k, max+k] [max−k,max+k]。
若 m i n + k > m a x − k min+k > max - k min+k>max−k,则存在 k k k,使 m i n + k = m a x − k min + k = max - k min+k=max−k,即最低分数为 0 0 0;
若 m i n + k ≤ m a x − k min+k \leq max - k min+k≤max−k,则最低分数为 ( m a x − k ) − ( m i n − k ) (max - k) - (min - k) (max−k)−(min−k)
代码
class Solution {
public:
int smallestRangeI(vector<int>& nums, int k) {
int min(INT_MAX), max(-1);
for (auto num: nums) {
if (num < min) {
min = num;
}
if (num > max) {
max = num;
}
}
return (max - k < min + k)? 0: (max - min - 2 * k);
}
};