力扣刷题——910. 最小差值 II

题目要求输出结果为处理后数组的最大值与最小值之差。当同时增大或减小所有的数时,处理后的数组和原数组的答案是一样的,想要减小最终答案,需要对两类数字分别进行增大和减小。
由增大得到的最大值,与由减小得到的最小值两者组成的答案,才有可能比原数组中的答案要大。因此,最终得到的答案一定是由减小而得到的最大值,和由增大而得到的最小值,或者是原数组最大值和最小值所得到的。
通过贪心的策略,能够想到,最终组成的答案的最小值和最大值,在未处理的情况下,在排序的数组中存在相邻的关系。因此在保证新得到的最大值大于原数组最大值减去k,新得到的最小值小于原数组最小值加上k,通过排序,可以遍历一次数组找到答案,实现如下:

class Solution {
public:
    int smallestRangeII(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        if(n == 1)
            return 0;

        int temMax = nums[n - 1] - k, temMin = nums[0] + k;
        int newMax = nums[n - 1], newMin = nums[0];
        int res = nums[n - 1] - nums[0];

        for(int i = 1; i < n; i++)
        {
            newMax = max(temMax, nums[i - 1] + k);
            newMin = min(temMin, nums[i] - k);
            res = min(res, newMax - newMin);
        }
        return res;
    }
};
posted @ 2024-10-23 17:00  SuzumiyaYui  阅读(26)  评论(0)    收藏  举报