Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมค้นหาความแตกต่างน้อยที่สุดที่ k ระหว่างคู่องค์ประกอบทั้งหมดในอาร์เรย์ใน C++


สมมติว่าเราได้รับรายการที่มีตัวเลขจำนวนเต็มหลายจำนวน เราต้องหาความแตกต่างระหว่างค่าแต่ละคู่ในอาร์เรย์และหาค่าความแตกต่างน้อยที่สุดที่ 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