สมมติว่าเราได้รับรายการที่มีตัวเลขจำนวนเต็มหลายจำนวน เราต้องหาความแตกต่างระหว่างค่าแต่ละคู่ในอาร์เรย์และหาค่าความแตกต่างน้อยที่สุดที่ k ดัชนีเริ่มต้นที่ 0 และค่า k ถูกกำหนดให้เป็นอินพุต
ดังนั้น หากอินพุตเหมือนกับตัวเลข ={2, 6, 4, 8}, k =2 ผลลัพธ์จะเป็น 2
ความแตกต่างระหว่างคู่คือ −
(2, 6) =4
(2, 4) =2
(2, 8) =6
(6, 4) =2
(6, 8) =2
(4, 8) =4
หากเราจัดเรียงค่า มันจะกลายเป็น 2, 2, 2, 4, 4, 6 ค่าที่น้อยที่สุดอันดับ 2 คือ 2 (ดัชนีเริ่มต้นจาก 0)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- เพิ่ม k ขึ้น 1
- จัดเรียงอินพุตอาร์เรย์
- เล :=0
- ri:=องค์ประกอบสุดท้ายของอินพุต - รายการแรกของอินพุต
- ในขณะที่ le
- กลาง :=(le + ri) / 2
- tmp :=0
- lp :=0
- สำหรับการเริ่มต้น i :=1 เมื่อฉัน <ขนาดของอินพุต อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- ในขณะที่อินพุต[i] - อินพุต[lp]> กลาง ทำ −
- lp :=lp + 1
- tmp :=tmp + i - lp
- ถ้า tmp> =k แล้ว −
- ริ :=กลาง
- มิฉะนั้น
- le :=mid + 1
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include<bits/stdc++.h> using namespace std; int solve(vector<int>& input, int k) { k++; sort(input.begin(), input.end()); int le = 0; int ri = input.back() - input[0]; while (le < ri) { int mid = (le + ri) / 2; long long tmp = 0; int lp = 0; for (int i = 1; i < input.size(); i++) { while (input[i] - input[lp] > mid) lp++; tmp += i - lp; } if (tmp >= k) ri = mid; else le = mid + 1; } return le; } int main() { vector<int> numbers = {2, 6, 4, 8}; cout<< solve(numbers, 2) <<endl; return 0; }
อินพุต
vector<int> numbers = {2, 6, 4, 8}; cout<< solve(numbers, 2) <<endl;
ผลลัพธ์
2