难度困难90
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
限制:
当然二重for循环暴力可以解决,但是会超时;
实际上是一道二分思想的归并排序题目
对于两个已经排序好的数组进行归并的时候,当且仅当右边的有序数组归并进去的时候,要把左边没有被归并的数组数目加到逆序个数里面;
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 48 49 50 51 52 53
| class Solution { public: vector<int >temp; int mergesort(vector<int>&nums,int l,int r){ if(l>=r){ return 0; }; int tempresult=0; int mid=l+((r-l)>>1); tempresult=mergesort(nums,l,mid)+mergesort(nums,mid+1,r); int i=l; int j=mid+1; int cnt=0; while(i<=mid&&j<=r){ if(nums[i]<=nums[j]){ temp[cnt++]=nums[i++]; }else{ temp[cnt++]=nums[j++]; tempresult+=mid-i+1; } } while(i<=mid){ temp[cnt++]=nums[i++]; } while(j<=r){ temp[cnt++]=nums[j++]; } for (int i = 0; i < r - l + 1; ++i) nums[i + l] = temp[i]; return tempresult;
}
int reversePairs(vector<int>& nums) { if(nums.size()<2){ return 0;
} else{ int result=0; temp.resize((int)nums.size()+1, 0); result=mergesort(nums,0,(int)nums.size()-1); return result;
} } };
|