1. 程式人生 > >陣列中的逆序對(java版)

陣列中的逆序對(java版)

【解題思路】在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007

【輸入描述】題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5

【輸入樣例】
1,2,3,4,5,6,7,0

【輸出樣例】
7

注:從題目描述來看,測試資料會非常大,單純的暴力迴圈會超時

【解題思路】
//1. 利用二路歸併排序的思想。
//2. 在二路歸併排序中,若左子區間的某個數a[i]>a[j]右子區間的某個數,則從a[i~center]都是大於a[j]的,所以逆序數也就等於count +=center-i+1,這裡center為左子區間的最後一個值的下標。

public class Solution {
    private long count;
    public int InversePairs(int [] array) {
        if(array==null || array.length==0){
            return 0;
        }
        count = 0;
        mergeSort(array, 0, array.length-1);
        int c = new Long(count%1000000007).intValue();
        return c;
    }

    public
void mergeSort(int[] input, int left, int right){ int mid = (left + right) / 2; if (left < right) { // 左邊 mergeSort(input,left,mid); // 右邊 mergeSort(input,mid+1,right); // 左右歸併 sort(input,left,mid,right); } } public
void sort(int[] input, int left, int center, int right){ int []tempArray = new int[right-left+1]; int mid = center+1; int temp = left; int current = 0; while(left<=center && mid<=right){ if(input[left]>input[mid]){ tempArray[current++]=input[mid++]; count +=center-left+1; }else{ tempArray[current++]=input[left++]; } } //只會執行一個 while(left<=center){ tempArray[current++]=input[left++]; } while(mid<=right){ tempArray[current++]=input[mid++]; } current=0; while(temp<=right){ input[temp++]=tempArray[current++]; } } }