C++ 中的最小范围 II


假设我们有一个整数数组 A,对于每个整数 A[i],我们必须选择 x = -K 或 x = K,并将 x 添加到 A[i](仅一次)。因此,在此过程之后,我们得到一个数组 B。我们必须找出 B 的最大值和 B 的最小值之间的最小可能差值。因此,如果输入是 A = [0,10],K = 2,那么输出为 6,因为 B = [2,8]。

为解决此问题,我们将遵循以下步骤 -

  • 设置 ret := 0,n := 数组 A 的大小

  • 对数组 A 进行排序

  • 设置 ret := A 的最后一个元素 - A 的第一个元素

  • right := A 的最后一个元素 - K 和 left := A 的第一个元素 + k

  • 对于 i 在 0 到 n - 1 之间的范围

    • mx := A[i] + k 和 right 的最大值

    • mn := A[i + 1] - k 和 left 的最小值

    • ret := ret 和 (mx - min) 的最小值

  • 返回 ret

让我们看看以下实现以获得更好的理解 -

示例

 现场演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int smallestRangeII(vector<int>& A, int k) {
      int ret = 0;
      int n = A.size();
      sort(A.begin(), A.end());
      ret = A[n - 1] - A[0];
      int mx, mn;
      int right = A[n - 1] - k;
      int left = A[0] + k;
      for(int i = 0; i < n - 1; i++){
         mx = max(A[i] + k, right);
         mn = min(A[i + 1] - k, left);
         ret = min(ret, mx - mn);
      }
    return ret;
   }
};
main(){
   vector<int> v = {0, 10};
   Solution ob;
   cout << (ob.smallestRangeII(v, 2));
}

输入

[0,10]
2

输出

6

更新于: 30-Apr-2020

196 浏览量

开启您的 职业生涯

完成课程以获得认证

开始
广告
© . All rights reserved.