53.数组中的逆序对
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
输入一个数组,求出这个数组中的逆序对的总数。
数据范围:
给定数组的长度 [0,100]。
样例:
输入:[1,2,3,4,5,6,0]
输出:6
代码:
class Solution {
//记录逆序对数量
int res = 0;
public int inversePairs(int[] nums) {
//进行归并排序
merge(nums,0,nums.length-1);
//返回结果
return res;
}
public void merge(int[] nums,int l,int r){
//当l>=r时,直接返回
if(l>=r)return;
//计算中点
int mid = l+r>>1;
//递归处理左右半部分
merge(nums,l,mid);
merge(nums,mid+1,r);
//创建临时数组存放合并结果
int[] q = new int[r-l+1];
//m为左半部分指针,n为右半部分指针
int m = l,n = mid+1,cnt = 0;
//合并两个有序数组
while(m<=mid&&n<=r){
//左元素 <= 右元素,不构成逆序对
if(nums[m]<=nums[n])q[cnt++] = nums[m++];
// 左元素 > 右元素,构成逆序对
else {
q[cnt++] = nums[n++];
//当前左半部分剩余元素都与nums[n]构成逆序对
res+= mid-m+1;
}
}
//处理左半部分剩余元素
while(m<=mid)q[cnt++] = nums[m++];
//处理右半部分剩余元素
while(n<=r)q[cnt++] = nums[n++];
//将排序好的数组拷贝回原数组
for(int i = l,j = 0;i<=r;i++,j++)nums[i] = q[j];
}
}

浙公网安备 33010602011771号