您的位置:首页 > 其它

数组中的逆序对

2016-06-23 21:54 204 查看

题目

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

解题

方法一:暴力

public class Solution {
public int InversePairs(int [] array) {
if(array == null || array.length <=1)
return 0;
int count = 0;
int len = array.length;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(array[i] > array[j]){
count ++;
}
}
}
return count;
}
}


方法二:归并排序

public class Solution {
public int InversePairs(int [] array) {
if(array.length<=0)
return 0;
return mergeSort(array,0,array.length-1);
}
public int  mergeSort(int[] array,int l,int r){
if(l>=r){
return 0;
}
int mid=(l+r)/2;
int lnums=mergeSort(array,l,mid);
int rnums=mergeSort(array,mid+1,r);
return  lnums+rnums+merge(array,l,mid,r);
}
public int merge(int[] array,int l,int mid,int r){
int [] temp = new int[r-l+1];

int count=0;
int i=l;
int j=mid+1;
int t=0;
while(i<=mid && j<=r){

if(array[i]>array[j]){ // 说明:i - mid 内的数都大于 array[j]
temp[t++]=array[j];
count+=mid-i+1; // 计算逆序对个数
j++;
}else {
temp[t++]=array[i];
i++;
}
}
// 剩余的数补上去
// i越界了 增加 j
while(i>mid&&j<=r){
temp[t++]=array[j];
j++;
}
// j越界了 增加 i
while(i<=mid&&j>r){
temp[t++]=array[i];
i++;
}
// 利用temp数组更新array数组
for(i=l;i<=r;i++){
array[i]=temp[i-l];
}
return count;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: