Fork me on GitHub

Reverse Pairs

Description

https://leetcode.com/problems/reverse-pairs/description/

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
int reversePairs(vector<int>& nums) {
int size = nums.size();
if (size == 0 || size == 1) return 0;
int ret = 0;
findReversePair(nums, 0, size - 1, ret);
// for (int i = 0; i < size; i++) cout << nums[i] << endl;
return ret;
}

void findReversePair(vector<int>& nums, int left, int right, int& ret) {
// cout << left << " " << right << endl;
if (left >= right) return;

int mid = left + (right - left) / 2;
findReversePair(nums, left, mid, ret);
findReversePair(nums, mid + 1, right, ret);

//Check the number and sort the array
int l = left;
int r = mid + 1;
while (l <= mid && r <= right) {
while(l <= mid && nums[l]/2.0 <= nums[r]) {++l; ret += (r - mid - 1);}
while(r <= right && nums[l]/2.0 > nums[r]) ++r;
}
while (l <= mid) {++l; ret += (r - mid - 1);}
sort(nums.begin()+left, nums.begin()+right+1);
}
};