题目:
给定一个数组 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位整数的表示范围内。
代码:
class Solution {
public:
int reverse(vector<int>& nums,int start,int end){
if(end-start<1)return 0;
int mid=start+(end-start)/2;
int l=reverse(nums,start,mid);
int r=reverse(nums,mid+1,end);
int count=l+r,i=start,j=mid+1;
while(i<=mid&&j<=end){
if((long long)nums[i]>2*(long long)nums[j]){count+=mid-i+1;j++;}
else{
i++;
}
}
sort(nums.begin()+start,nums.begin()+end+1);
return count;
}
int reversePairs(vector<int>& nums) {
return reverse(nums,0,nums.size()-1);
}
};
思路:
递归,先算左半个区间和右半个区间,然后再算起点在左,终点在右的区间。
易错点在于,溢出问题,溢出要使用long long解决,不要使用float解决,float在数字多,且数字大的情况下,会出现误差。