51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
解题思路
方法一:暴力解法(超时)
class Solution {
public:
int reversePairs(vector<int>& nums) {
if(nums.size() < 2) return 0;
int count = 0;
for(int i = 0; i < nums.size() - 1; i++) {
for(int j = i; j < nums.size(); j++) {
if(nums[i] > nums[j]) count++;
}
}
return count;
}
};
方法二:归并排序
class Solution {
public:
int reversePairs(vector<int>& nums) {
int n = nums.size();
if(n < 2) return 0;
vector<int> tmp(n);
return mergeSort(nums, tmp, 0, n - 1);
}
private:
int mergeSort(vector<int>& nums, vector<int>& tmp, int left, int right) {
if(left >= right) return 0;
int mid = (left + right) / 2;
int count = mergeSort(nums, tmp, left, mid) + mergeSort(nums, tmp, mid + 1, right);
int i = left, j = mid + 1, pos = left;
while(i <= mid && j <= right) {
if(nums[i] <= nums[j]) {
tmp[pos] = nums[i];
++i;
count += (j - (mid + 1));
} else {
tmp[pos] = nums[j];
++j;
}
++pos;
}
for(int k = i; k <= mid; ++k) {
tmp[pos++] = nums[k];
count += (j - (mid + 1));
}
for(int k = j; k <= right; k++) {
tmp[pos++] = nums[k];
}
copy(tmp.begin() + left, tmp.begin() + right + 1, nums.begin() + left);
return count;
}
};