面试题51:数组中的逆序对
文章目录
题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
考点
归并排序
LeetCode版本
class Solution {
public:
int part(vector<int> &nums, vector<int> &temp, int begin, int end){
if(begin >= end) return 0;
int mid =((end - begin)>>1) + begin;
int leftnum = part(nums, temp,begin,mid);
int rightnum = part(nums, temp, mid+1,end);
for(int k = begin; k <= end; k++){
temp[k] = nums[k];
}
int i = begin, j = mid+1, count = 0, tidx = begin;
while(i<= mid && j<= end){
if(temp[i] > temp[j]){
count += mid - i + 1;
nums[tidx++] = temp[j++];
}else{
nums[tidx++] = temp[i++];
}
}
while(i<= mid) nums[tidx++] = temp[i++];
while(j<= end) nums[tidx++] = temp[j++];
return leftnum + rightnum + count;
}
int reversePairs(vector<int>& nums) {
if(nums.empty())return 0;
vector<int> temp(nums.size());
return part(nums,temp,0,nums.size()-1);
}
};