Given an array nums
, we call (i,
j)
an important reverse pair if i
< j
and nums[i] > 2*nums[j]
.
You need to return the number of important reverse pairs in the given array.
解題思路:
1.歸併排序
用歸併排序將數組從小到大排序,在歸併過程中,將數組從前往後,從小到大合併,並用一個索引p記錄當前處於前一半歸併數組的nums[i]值有多少個後一半數組的nums[j],使得nums[i]>2*nums[j],然後在此基礎上往後面疊加p,因爲對於處於前一半數組的nums[i] <= nums[i'],必有p<=p'。故p的值只需要逐步往後累加。再將各個p值加起來就是所求答案。
class Solution {
public:
int ans;
void merge(vector<int>& nums, int L, int R){
int len = R - L + 1, mid = (L + R)/2;
int* c = new int[len];
int i = L, j = mid + 1, k = 0;
int p = j;
while(i <= mid){
while(p <= R && nums[i] > 2LL * nums[p])p++;
ans += p - mid - 1;
while(j <= R && nums[i] >= nums[j])c[k++] = nums[j++];
c[k++] = nums[i++];
}
while(j <= R)c[k++] = nums[j++];
for(i = 0; i < len; i++)nums[i + L] = c[i];
delete[] c;
}
void mergeSort(vector<int>& nums, int L, int R){
if(L >= R)return;
int mid = (L + R)/2;
mergeSort(nums, L, mid);
mergeSort(nums, mid + 1, R);
merge(nums, L, R);
}
int reversePairs(vector<int>& nums) {
int len = nums.size();
ans = 0;
mergeSort(nums, 0, len - 1);
/*
for(int i = 0; i < len; i++)cout << nums[i] << " ";
cout << endl;
*/
return ans;
}
};