《劍指offer》系列 陣列中的逆序對(Java)
阿新 • • 發佈:2018-11-25
連結
牛客:陣列中的逆序對
題目描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述
題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
示例1
輸入
1,2,3,4,5,6,7,0
輸出
7
思路
是歸併排序(MergeSort)的變種,主要是將merge方法改寫。
程式碼
public class Solution { private int total = 0; public int InversePairs(int [] array) { if (array == null) { return 0; } mergeSort(array, 0, array.length - 1); return total; } private void mergeSort(int[] array, int low, int high) { int mid = (low + high) / 2; if (low < high) { mergeSort(array, low, mid); mergeSort(array, mid + 1, high); merge(array, low, mid, high); } } private void merge(int[] array, int low, int mid, int high) { int len = high - low + 1; int i = low; int j = mid + 1; int[] data = new int[len]; int k = 0; while (i <= mid && j <= high) { // 已結保證輸入的陣列中沒有相同的數字了,所以不用再考慮等號的情況 if (array[i] < array[j]) { data[k++] = array[i++]; } else { data[k++] = array[j++]; total += mid - i + 1; // 數的量級比較大,所以每一次合併之後都要取模 total %= 1000000007; } } while (i <= mid) { data[k++] = array[i++]; } while (j <= high) { data[k++] = array[j++]; } for (int x = 0; x< len; x++) { array[low + x] = data[x]; } } }