36. 陣列中逆序對的個數
阿新 • • 發佈:2020-12-16
技術標籤:劍指offer--JAVA實現
題目描述:在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P.
思路:本質是歸併排序,在比較時加入全域性變數 count 進行記錄逆序對的個數,若
data[start] >= data[index] ,則 count 值為 mid+1-start
程式碼實現:
int count = 0; public int InversePairs(int [] array) { if(array==null) return 0; mergeSort(array,0,array.length-1); return count; } private void mergeSort(int[] data,int start,int end) { int mid = (start + end) / 2; if (start < end) { mergeSort(data, start, mid); mergeSort(data, mid + 1, end); merge(data, start, mid, end); } } private void merge(int[] data,int start,int mid,int end) { int arr[] = new int[end - start + 1]; int c = 0; int s = start; int index = mid + 1; while (start <= mid && index <= end) { if (data[start] < data[index]) { arr[c++] = data[start++]; } else { arr[c++] = data[index++]; count += mid +1 - start; count %= 1000000007; } } while (start <= mid) { arr[c++] = data[start++]; } while (index <= end) { arr[c++] = data[index++]; } for (int d : arr) { data[s++] = d; } }