1、题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
2、算法分析
本题使用双层for循环超时。
思路:
使用归并算法,归并算法采用经典分治思想。分治法将问题分为一些小的问题然后递归进行求解,治将分的阶段进行合并。
借鉴:图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园
本题是求逆序对,定义变量计数。
具体看代码:
3、代码实现
class Solution {
int count = 0;
public int reversePairs(int[] nums) {
if(nums.length != 0){
divided(nums,0,nums.length - 1);
}
return count;
}
// 将元素拆分,
public void divided(int[] arr,int start,int end){
if(start >= end){
return;
}
int mid = start + (end - start) / 2;
// 拆分
divided(arr,start,mid);
divided(arr,mid + 1,end);
// 合并
merged(arr,start,mid,end);
}
// 有序的合并
public void merged(int[] arr,int start,int mid,int end){
int[] res = new int[end - start + 1];
int i = start;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= end){
if(arr[i] <= arr[j]){
res[k++] = arr[i++];
}else{
res[k++] = arr[j++];
count += (mid - i + 1);
}
}
while(i <= mid){
res[k++] = arr[i++];
}
while(j <= end){
res[k++] = arr[j++];
}
// 将临时数中的的数据拷贝到arr中
for(int x = 0; x < res.length ;x++){
arr[start + x] = res[x];
}
}
}