1. 程式人生 > >[劍指offer][Java]陣列中的逆序對

[劍指offer][Java]陣列中的逆序對

題目

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

程式碼

注意點:

  • 歸併排序:Java不能切片,所以用start,end,mid控制陣列內切片長度
  • Java
public class Solution {
    private int count;
    public int InversePairs(int [] array) {
        count = 0;
        if(array != null){
            mergeSort(array, 0
, array.length - 1); } return count; } private void mergeSort(int[] a, int start, int end){ if(start >= end) return; int mid = start + (end - start) / 2; mergeSort(a, start, mid); mergeSort(a, mid+1, end); merge(a,start,mid,end); } private
void merge(int[] a, int start, int mid, int end){ int[] temp = new int[end-start+1]; int i = start, j = mid + 1, k = 0; while (i <= mid && j <= end) { if (a[i] <= a[j]) temp[k++] = a[i++]; else { temp[k++] = a[j++]; // ai大於aj,由於歸併,所以相反的必定是和所有前面的數字,所以是mid到最左邊i中間的數的個數
count = (count + mid - i + 1) % 1000000007; } } while (i <= mid) temp[k++] = a[i++]; while (j <= end) temp[k++] = a[j++]; for(k=0;k<temp.length;k++){ //將臨時陣列的數字寫回a陣列! a[start+k] = temp[k]; } } }