题目:
解题思路;
由于需要对数组中的每一个进行 +k 或 -k 的操作,这时要求最小差值,即对较大的数 -k 对较小的数 +k。
需要先对数组进行排序,再枚举对元素的操作。
- 对 nums[0] 到 nums[i - 1] 的数进行 +k
- 对 nums[i] 到 nums[numsSize - 1] 的数进行 -k
此时最大数是 nums[i - 1] 或者 nums[numsSize - 1]
最小数是 nums[0] 或者 nums[i]
时间复杂度:
空间复杂度:
#define MAX(a,b) (a > b) ? a : b;
#define MIN(a,b) (a < b) ? a : b;
int cmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int smallestRangeII(int* nums, int numsSize, int k) {
qsort(nums, numsSize, sizeof(int), cmp);
int max, min;
int ans = nums[numsSize - 1] - nums[0];
for (int i = 1; i < numsSize; i++) {
max = MAX(nums[i-1] + k, nums[numsSize-1] - k);
min = MIN(nums[0] + k, nums[i] - k);
ans = MIN(ans, max - min);
}
return ans;
}