คำอธิบายปัญหา
กำหนดอาร์เรย์ A และค่า K สำหรับแต่ละ A[i] เลือกบวก K หรือลบ K ได้เพียงครั้งเดียว ได้อาร์เรย์ B ต้องการให้ max(B) - min(B) น้อยที่สุด
ตัวอย่าง: A=[0,10], K=2 → B=[2,8] → diff=6
วิธีแก้ปัญหา (Sort + Greedy)
- เรียง A จากน้อยไปมาก
- คำตอบเริ่มต้น = A[n-1] - A[0] (ไม่บวกลบอะไร)
- พิจารณาแบ่งที่ i: ซ้ายบวก K, ขวาลบ K
- max = max(A[i]+K, A[n-1]-K)
- min = min(A[0]+K, A[i+1]-K)
- อัปเดตคำตอบ = min(คำตอบ, max-min)
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int smallestRangeII(vector<int>& A, int K) {
sort(A.begin(), A.end());
int n = A.size();
int ans = A[n-1] - A[0];
for(int i = 0; i < n - 1; i++) {
int mx = max(A[i] + K, A[n-1] - K);
int mn = min(A[0] + K, A[i+1] - K);
ans = min(ans, mx - mn);
}
return ans;
}
};
int main() {
vector<int> v = {0, 10};
Solution ob;
cout << ob.smallestRangeII(v, 2);
return 0;
}
อินพุต
[0,10] 2
เอาต์พุต
6