910-最小插值 ||

题目:

给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。
在此过程之后,我们得到一些数组 B。
返回 B 的最大值和 B 的最小值之间可能存在的最小差值。

示例 1

输入:A = [1], K = 0
输出:0
解释:B = [1]

示例 3:

输入:A = [1,3,6], K = 3
输出:3
解释:B = [4,6,3]

解题思路

对于数组A,如果 A[i] < A[j],将较小的值A[i]增加K,较大的值A[j]减少K,则它们之间的差值一定比原来更小,这是因为区间 (A[i] + K, A[j] - K) 是 (A[i] - K, A[j] + K) 的子集(这里,当 a > b 时 (a, b) 表示 (b, a) )。那我们何不对数组进行排序,在排序中的数组中,找到一个位置 i,将 i 右侧的值做加 K 操作,i右侧的值做减 K 操作,即A[0]...A[i]全部加上K,A[i+1]...A[n-1]全部减去K。此时,整个数组的最大值只可能是 A[n-1]-K 或者 A[i]+K, 而最小值只可能是 A[0]+K 或 A[i+1]-K。那我们只需要遍历整个数组 A,找出 位置 i,使得 数组 B 中最大值和最小值的差值最小。

代码

var smallestRangeII = function(A, K) {
    A.sort((a,b) => {return a-b});
    len = A.length;
    minNum = A[0];
    maxNum = A[ len - 1 ];
    res = maxNum - minNum;
    for(let i = 0; i < len - 1; i++) {
        res = Math.min(res, Math.max(maxNum-K, A[i] + K) - Math.min(minNum + K, A[i + 1] - K))
    }
    return res;
};
posted @ 2020-08-06 17:46  精灵W的博客  阅读(159)  评论(0编辑  收藏  举报