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

ย้อนกลับคู่ใน C++


สมมติว่าเรามีอาร์เรย์ ในอาร์เรย์นี้ เราจะบอกว่าคู่หนึ่งคู่ (A[i] และ A[j]) เป็นคู่ย้อนกลับที่สำคัญหากเป็นไปตามเงื่อนไขต่อไปนี้ -

  • ถ้าฉัน 2* nums[j]

เราต้องหาจำนวนคู่ถอยที่สำคัญ ดังนั้นหากอินพุตเป็นเช่น [2,8,7,7,2] ผลลัพธ์จะเป็น 3

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ในขณะที่ j <=สูง ทำ −
    • temp[k] :=a[j]
    • (เพิ่ม k ขึ้น 1)
    • (เพิ่ม j ขึ้น 1)
  • k :=0
  • สำหรับการเริ่มต้น i :=ต่ำ เมื่อฉัน <=สูง อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
    • a[i] :=temp[k]
    • (เพิ่ม k ขึ้น 1)
  • กำหนดฟังก์ชัน calc() ซึ่งจะใช้อาร์เรย์ a ต่ำ สูง
  • ถ้าต่ำ>=สูง แล้ว −
    • คืนสินค้า
  • กลาง :=ต่ำ + (สูง - ต่ำ)/2
  • เรียกฟังก์ชัน calc(a, low, mid)
  • เรียกฟังก์ชัน calc(a, mid + 1, high)
  • เรียกฟังก์ชันผสาน (a ต่ำ กลาง สูง)
  • กำหนดฟังก์ชัน Solve() ซึ่งจะใช้อาร์เรย์ A
  • ตอบ :=0
  • n :=ขนาดของ A
  • เรียกฟังก์ชัน calc(A, 0, n - 1)
  • คืนสินค้า
  • จากวิธีหลัก ให้ทำดังนี้
  • โทรกลับฟังก์ชัน Solve(nums)
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       int ans = 0;
       void merge(vector <int> &a, lli low, lli mid, lli high){
          lli k = high - low + 1;
          vector <lli> temp(k);
          lli i = low, j = mid + 1;
          k = 0;
          lli first = mid + 1;
          while(i <= mid){
             while(first <= high && (lli)a[first] * 2 < (lli)a[i]) {
                first++;
             }
             while(j <= high && a[j] <= a[i])
             {
                temp[k] = a[j];
                j++;
                k++;
             }
             ans += first - (mid + 1);
             temp[k] = a[i];
             i++;
             k++;
          }
          while(j <= high){
             temp[k] = a[j];
             k++;
             j++;
          }
          k = 0;
          for(lli i = low; i <= high; i++){
             a[i] = temp[k];
             k++;
          }
       }
       void calc(vector <int> &a, lli low, lli high){
          if(low >= high)return;
          lli mid = low + (high - low)/2;
          calc(a, low, mid);
          calc(a, mid + 1, high);
          merge(a, low, mid, high);
       }
       lli solve(vector<int> &A) {
          ans = 0;
          lli n = A.size();
          calc(A, 0, n - 1);
          return ans;
       }
       int reversePairs(vector<int>& nums) {
          return solve(nums);
       }
    };
    main(){
       Solution ob;
       vector<int> v = {2,8,7,7,2};
       cout << (ob.reversePairs(v));
    }

    อินพุต

    {2,8,7,7,2}

    ผลลัพธ์

    3