493 Reverse Pairs 翻转对
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1]
输出: 2
示例 2:
输入: [2,4,3,5,1]
输出: 3
注意:
给定数组的长度不会超过50000。
输入数组中的所有数字都在32位整数的表示范围内。
详见:https://leetcode.com/problems/reverse-pairs/description/
C++:
class Solution { public: int reversePairs(vector<int>& nums) { int n = nums.size(); if(n <= 1) { return 0; } int cnt = 0; vector<int> b(nums.begin(), nums.begin() + n / 2); vector<int> c(nums.begin() + n / 2, nums.end()); cnt += reversePairs(b); cnt += reversePairs(c); int ai = 0, bi = 0, ci = 0; while(ai < n) { if(bi < b.size() && (ci == c.size() || b[bi] <= c[ci])) { nums[ai++] = b[bi++]; } else { long tmp2 = (long)c[ci]*2; int low = 0,high = b.size() - 1,pos = bi; while(low <= high) { pos = (low + high)/2; if((long)b[pos] == tmp2) { low++; } else if((long)b[pos] > tmp2) { high = pos - 1; } else { low = pos + 1; } } if(low < b.size() && low >= 0 && (long)b[low] > tmp2) { cnt += n/2 - low; } nums[ai++] = c[ci++]; } } return cnt; } };
参考:https://blog.csdn.net/lin360580306/article/details/60326795