493. Reverse Pairs
Description Difficulty: Hard
Related Topics: Array , Binary Search , Divide and Conquer , Binary Indexed Tree , Segment Tree , Merge Sort , Ordered Set
Given an integer array nums
, return the number of reverse pairs in the array .
A reverse pair is a pair (i, j)
where:
0 <= i < j < nums.length
and
nums[i] > 2 * nums[j]
.
Example 1:
1 2 3 4 5 Input: nums = [1,3,2,3,1] Output: 2 Explanation: The reverse pairs are: (1, 4) --> nums[1] = 3, nums[4] = 1, 3 > 2 * 1 (3, 4) --> nums[3] = 3, nums[4] = 1, 3 > 2 * 1
Example 2:
1 2 3 4 5 6 Input: nums = [2,4,3,5,1] Output: 3 Explanation: The reverse pairs are: (1, 4) --> nums[1] = 4, nums[4] = 1, 4 > 2 * 1 (2, 4) --> nums[2] = 3, nums[4] = 1, 3 > 2 * 1 (3, 4) --> nums[3] = 5, nums[4] = 1, 5 > 2 * 1
Constraints:
1 <= nums.length <= 5 * 104
-231 <= nums[i] <= 231 - 1
Hints/Notes
merge sort
improve time complexity
Solution Language: C++
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 class Solution {public : int count = 0 ; vector<int > tmp; int reversePairs (vector<int >& nums) { int size = nums.size (); tmp = vector (size, 0 ); sort (nums, 0 , size - 1 ); return count; } void sort (vector<int >& nums, int low, int high) { if (low >= high) return ; int mid = low + (high - low) / 2 ; sort (nums, low, mid); sort (nums, mid + 1 , high); merge (nums, low, mid, high); } void merge (vector<int >& nums, int low, int mid, int high) { for (int i = low; i <= high; i++) { tmp[i] = nums[i]; } int end = mid + 1 ; for (int i = low; i <= mid; i++) { while (end <= high && ((long )nums[i] > (long )nums[end] * 2 )) { end++; } count += end - mid - 1 ; } int p1 = low, p2 = mid + 1 , index = low; while (index <= high) { if (p1 == mid + 1 ) { nums[index++] = tmp[p2++]; } else if (p2 == high + 1 ) { nums[index++] = tmp[p1++]; } else if (tmp[p1] > tmp[p2]) { nums[index++] = tmp[p2++]; } else { nums[index++] = tmp[p1++]; } } } };