สมมติว่าเรามีอาร์เรย์ A ของจำนวนเต็ม สำหรับแต่ละจำนวนเต็ม A[i] เราต้องเลือก x =-K หรือ x =K และเพิ่ม x ให้กับ A[i] (เพียงครั้งเดียว) หลังจากกระบวนการนี้ เรามีอาร์เรย์ B เราต้องหาความแตกต่างที่น้อยที่สุดที่เป็นไปได้ระหว่างค่าสูงสุดของ B และค่าต่ำสุดของ B ดังนั้นหากอินพุตคือ A =[0,10], K =2 แล้ว ผลลัพธ์จะเป็น 6 เนื่องจาก B =[2,8].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
set ret :=0, n :=ขนาดของอาร์เรย์ A
-
จัดเรียงอาร์เรย์ A
-
set ret :=องค์ประกอบสุดท้ายของ A – องค์ประกอบแรกของ A
-
ขวา :=องค์ประกอบสุดท้ายของ A – K และซ้าย :=องค์ประกอบแรกของ A + k
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
mx :=สูงสุดของ A[i] + k และขวา
-
mn :=นาทีของ A[i + 1] – k และซ้าย
-
ret :=นาทีของ ret และ (mx - min)
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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