剑指 Offer 51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
class Solution {
private:
int count = 0;
public:
int reversePairs(vector<int>& nums) {
// int count = 0;
// for(int i = 0; i < nums.size(); ++i){
// for(int j = i + 1; j < nums.size(); ++j){
// if(nums[i] > nums[j]){
// ++count;
// }
// }
// }
// return count;
merge(nums, 0, nums.size() - 1);
return count;
}
void merge(vector<int> &nums, int left, int right){
int mid = left + (right - left) / 2;
if(left < right){
merge(nums, left, mid);
merge(nums, mid + 1, right);
mergeSort(nums, left, mid, right);
}
}
void mergeSort(vector<int> &nums, int left, int mid, int right){
vector<int> temp(right - left + 1);
int temp1 = left, temp2 = mid + 1;
int index = 0;
while(temp1 <= mid && temp2 <= right){
if(nums[temp1] <= nums[temp2]){
temp[index++] = nums[temp1++];
} else {
count += (mid - temp1 + 1);
temp[index++] = nums[temp2++];
}
}
while(temp1 <= mid){
temp[index++] = nums[temp1++];
}
while(temp2 <= right){
temp[index++] = nums[temp2++];
}
for(int i = 0; i < temp.size(); ++i){
nums[i + left] = temp[i];
}
}
};