493. Reverse Pairs
// see more at https://www.youtube.com/watch?v=j68OXAMlTM4 // https://leetcode.com/problems/reverse-pairs/discuss/97268/general-principles-behind-problems-similar-to-reverse-pairs // http://www.cnblogs.com/grandyang/p/6657956.html class Solution { public: int reversePairs(vector<int>& nums) { return reversePairs(nums, 0, nums.size()-1); } int reversePairs(vector<int>& nums, int begin, int end) { if (begin >= end) return 0; int m = begin + (end - begin) / 2; int res = reversePairs(nums, begin, m); res += reversePairs(nums, m+1, end); int *p = new int[end-begin+1]; int i = begin, j = m+1; while (i <= m && j <= end) { if (nums[i] > 2L * nums[j]) { // avoid overflow res += m - i + 1; j++; } else { i++; } } i = begin; j = m+1; int k = 0; while (i <= m && j <= end) { if (nums[i] > nums[j]) p[k++] = nums[j++]; else p[k++] = nums[i++]; } while (i <= m) p[k++] = nums[i++]; while (j <= end) p[k++] = nums[j++]; for (int i = begin; i <= end; i++) { nums[i] = p[i-begin]; } //sort(nums.begin() + begin, nums.begin() + end+1); return res; } };