zoukankan      html  css  js  c++  java
  • leetcode 910 最小差值II

    题目描述:

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

    题解:

      首先将数组 $A$排序,为了让最大值与最小值的gap最小化,我们期望较小的值加上$k$,较大的值减去$k$。那么对于已经排序的数组,我们希望找到一个位置$i$,使得$A[0],A[1],...,A[i-1]$的数字都$+k$,$A[i],A[i+1],...,A[len-1]$的数字都$-k$。这样以$A[i]$为界限可以得到两个递增的序列,那么最小值$ = min(A[0]+k,A[i]-k)$,最大值$ = max(A[i-1]+k , A[len-1] - k)$。遍历所有的$i$就可以得到最终的解了。代码如下:

    class Solution {
    public:
    
        int smallestRangeII(vector<int>& A, int K) {
            sort(A.begin(),A.end());
            int len = A.size();
            if(len == 0) return 0;
            int ans = A[len-1] - A[0];
    
            for(int i=1;i<len;i++)
            {
                int l,r;
                l = min(A[0]+K,A[i]-K);
                r = max(A[i-1]+K,A[len-1]-K);
                ans = min(ans,r - l);
            }
    
            return ans;
        }
    };
  • 相关阅读:
    剑指 Offer 46. 把数字翻译成字符串
    leedcode:27. 移除元素
    1052. 爱生气的书店老板(滑动窗口)
    剑指 Offer 56
    剑指 Offer 11. 旋转数组的最小数字(二分)
    1919年巴黎和会顾维钧英语演讲稿
    状语从句
    定语从句
    名词性从句
    并列句
  • 原文地址:https://www.cnblogs.com/z1141000271/p/12987917.html
Copyright © 2011-2022 走看看