剑指Offer_数组中的逆序对

题目描述:

            在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

        思路:这个题目就是用的归并排序的思想,在归并排序中,我们需要对两个排好序的数组进行重新排序,如果数组A和数组B,A中第j个数小于B中第i个数,那么在A中第j个数到最后一个数都是和B中第i个数组成逆序数;

程序:

        

        

Copy:

    //归并排序
    int num=0;
    public int InversePairs(int [] array){
        mergeSort(array);
        return num%1000000007;
    }
    public void mergeSort(int[] array){
    int[] temArray=new int[array.length];
    mergeSort(0,array.length-1,array,temArray);
    }
    
    public  void mergeSort(int left,int right,int[] array,int[] temArray){
    if(left>=right)
    return;
    else{
    int mid=(left+right)/2;
    mergeSort(left,mid,array,temArray);
    mergeSort(mid+1,right,array,temArray);
    merge(left,mid,right,array,temArray);
    }
    }
    
     private  void merge(int leftStart, int leftEnd, int rightEnd, int[] array, int[] temArray) {
    int left= leftStart;
    int temStart=leftStart;
int rightStart=leftEnd+1;
int length=rightEnd-leftStart+1;
while(leftStart<=leftEnd&&rightStart<=rightEnd){
if(array[leftStart]<=array[rightStart])
temArray[temStart++]=array[leftStart++];
else{
temArray[temStart++]=array[rightStart++];
num+=leftEnd-leftStart+1;
                if(num>1000000007)
                    num%=1000000007;
}
}
while(leftStart<=leftEnd){
temArray[temStart++]=array[leftStart++];
         //   num+=leftEnd-leftStart+1;
}
while(rightStart<=rightEnd){
temArray[temStart++]=array[rightStart++];
}
for(int i=0;i<length;i++){
array[left]=temArray[left++];
}

}

猜你喜欢

转载自blog.csdn.net/qq_34144916/article/details/80885149