陣列中的逆序對(java版)
阿新 • • 發佈:2019-02-02
【解題思路】在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數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++];
}
}
}