leetcode 493
跟经典的逆序对问题没有什么区别, 首先考虑对数组前半部和后半部求逆序对数,若能保证两段数组都有序,则显然可以在线性时间内求出对数。
所以我们采用归并排序的方法,一方面让数组有序,另一方面计算子数组的逆序对数。
代码实现有些细节要注意,在比较时需要把Int转换为longlongint 不然会出错。
class Solution { public: int reversePairs(vector<int>& nums) { int ans=0; if(nums.size()<2)return ans; if(nums.size()==2) { if ((long long)nums[0]>(long long )nums[1]*2)ans=1; if((long long)nums[0]<(long long)nums[1]){int t=nums[0];nums[0]=nums[1];nums[1]=t;} return ans; } vector<int>left,right; int i; for(i=0;i<nums.size()/2;i++) left.push_back(nums[i]); for(;i<nums.size();i++) right.push_back(nums[i]); ans+=reversePairs(left);ans+=reversePairs(right); int j=0,tot=0; i=0; while(i<left.size()&&j<right.size()) { if((long long)left[i]>(long long)right[j]*2){i++;ans+=right.size()-j;} else j++; } i=j=0; while(i<left.size()&&j<right.size()) { if(left[i]>right[j])nums[tot++]=left[i++]; else nums[tot++]=right[j++]; } while(i<left.size()) nums[tot++]=left[i++]; while(j<right.size()) nums[tot++]=right[j++]; return ans; } };