在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题报告:
今天没用树状数组写,因为好久不练归并排序了得熟悉下,记住它是有额外空间复杂度的。
注意点1:最后的while里面别忘了也要统计cnt变量。
注意点2:如果函数里是l>=r而不是l==r的话就不需要特判num.size()==0了
AC代码:
class Solution {
public:int reversePairs(vector<int>& nums) {if(nums.size() == 0) return 0;return mergesort(nums, 0, nums.size()-1);}int mergesort(vector<int>& nums, int l, int r) {int cnt = 0;if(l == r) return 0;int mid = (l+r)/2;//[l, mid] [mid+1,r]cnt += mergesort(nums, l, mid);cnt += mergesort(nums, mid+1, r);vector<int> tmp;int p1 = l, p2 = mid+1;while(p1 <= mid && p2 <= r) {if(nums[p1] <= nums[p2]) {tmp.push_back(nums[p1]);p1++;cnt += p2 - (mid+1); }else {tmp.push_back(nums[p2]);p2++;}}while(p1 <= mid) {tmp.push_back(nums[p1++]);cnt += p2 - (mid+1);}while(p2 <= r) tmp.push_back(nums[p2++]);for(int i = l; i<=r; i++) {nums[i] = tmp[i-l];}return cnt;}
};