สมมติว่าเรามีอาร์เรย์ ในอาร์เรย์นี้ เราจะบอกว่าคู่หนึ่งคู่ (A[i] และ A[j]) เป็นคู่ย้อนกลับที่สำคัญหากเป็นไปตามเงื่อนไขต่อไปนี้ -
- ถ้าฉัน
2* nums[j]
เราต้องหาจำนวนคู่ถอยที่สำคัญ ดังนั้นหากอินพุตเป็นเช่น [2,8,7,7,2] ผลลัพธ์จะเป็น 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ตอบ :=0
- กำหนดฟังก์ชัน merge() ซึ่งจะใช้อาร์เรย์ a ต่ำ กลาง สูง
- k :=สูง - ต่ำ + 1
- กำหนดอุณหภูมิอาร์เรย์ขนาด k
- i :=ต่ำ, j =กลาง + 1, k :=0
- แรก :=กลาง + 1
- ในขณะที่ฉัน <=กลาง ทำ −
- ในขณะที่ก่อน <=สูงและ a[ก่อน] * 2
- (เพิ่มขึ้นก่อนทีละ 1)
- ในขณะที่ก่อน <=สูงและ a[ก่อน] * 2
- ในขณะที่ (j <=สูงและ a[j] <=a[i]) ทำ −
- temp[k] :=a[j]
- (เพิ่ม j ขึ้น 1)
- (เพิ่ม k ขึ้น 1)
- ans :=ans + first - (กลาง + 1)
- temp[k] :=a[i]
- (เพิ่ม i ขึ้น 1)
- (เพิ่ม k ขึ้น 1)
- temp[k] :=a[j]
- (เพิ่ม k ขึ้น 1)
- (เพิ่ม j ขึ้น 1)
- a[i] :=temp[k]
- (เพิ่ม k ขึ้น 1)
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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