码迷,mamicode.com
首页 > 其他好文 > 详细

910-最小插值 ||

时间:2020-08-06 19:29:56      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:tran   最大值   ++   mat   增加   let   i+1   fun   length   

题目:

给定一个整数数组 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;
};

910-最小插值 ||

标签:tran   最大值   ++   mat   增加   let   i+1   fun   length   

原文地址:https://www.cnblogs.com/xwwblog/p/13447818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!