陣列中的逆序對(Java實現)
阿新 • • 發佈:2019-02-01
本題為劍指offer面試題36
[程式設計題]陣列中的逆序對- 熱度指數:67584 時間限制:1秒 空間限制:32768K
輸入描述:
題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
輸入例子:
1,2,3,4,5,6,7,0
輸出例子:
7
package go.jacob.day510; /** * * @author Administrator 歸併排序的應用 */ public class Demo3 { // result用來儲存交換次數,temp為歸併排序所需的額外空間 private int result; static int[] temp; public int InversePairs(int[] array) { // 考慮無效輸入 if (array == null || array.length <= 0) { return 0; } // 注意:因為result設定為成員變數,所以每一次呼叫該方法都要初始化為0! result = 0; temp = new int[array.length]; sort(array, 0, array.length - 1); return result; } public void sort(int[] array, int left, int right) { if (left == right) { return; } int mid = (left + right) / 2; sort(array, left, mid); sort(array, mid + 1, right); merge(array, left, mid, right); } public void merge(int[] array, int left, int middle, int right) { int i = middle; int j = right; int index = right; //把本次迴圈用到的數字拷貝進temp for (int k = left; k <= right; k++) { temp[k] = array[k]; } while (i >= left && j >= middle + 1) { if (temp[i] > temp[j]) { array[index--] = temp[i--]; //逆序對數目為第二個子陣列中剩餘的數字 result += j - middle; // 數值過大要進行求餘 if (result > 1000000007) { result %= 1000000007; } } else array[index--] = temp[j--]; } while (i >= left) array[index--] = temp[i--]; while (j >= middle + 1) array[index--] = temp[j--]; } }