javaは単純に配列中の逆順の対を実現します。


テーマの説明:
配列内の2つの数字は、前の数字が後の数字より大きい場合、この2つの数字は逆の順序でペアを構成します。行列を入力して、この配列の逆順のペアの総数Pを求めます。そしてP対100000 00007型取りの結果を出力します。即ち出力P%100000 0000 07
問題解決の考え方:
最初は霧がかかっていましたが、後には使用して並べ替えの思想を思い出しました。実はいくつかの逆順があります。つまり並べ替えの時、後の数は前のどれを超えますか?うん、あまりよくないと思います。直接コードを見ましょう。なお、問題の中では型取りの結果を出力するということは、データが非常に大きいということですので、単純に最後に型取りをするだけではデータの大きさの影響は避けられないかもしれませんので、countを更新するたびに型取りを行います。
ちょうどもう一度練習しました。並べ替えて記録してください。

public class Solution {
  int count;
  public int InversePairs(int [] array) {
    count = 0;
    if(array != null){
      divPairs(array, 0, array.length-1);
    }
    return count%1000000007;
  }
  
  public void divPairs(int[] array, int start, int end){
    if(start >= end)
      return;
    int mid = (start + end)>>1;
    divPairs(array, start, mid);
    divPairs(array, mid+1, end);
    
    mergePairs(array, start, mid, end);
  }
  
  public void mergePairs(int[] array, int start, int mid, int end){
    int i = start, j = mid+1, k = 0;
    int[] temp = new int[end-start+1];
    while(i <= mid && j <= end){
      if(array[i] <= array[j]){
        temp[k++] = array[i++];
      }else{
        temp[k++] = array[j++];
        count += mid - i + 1;
        count %= 1000000007;
      }
    }
    while(i <= mid){
      temp[k++] = array[i++];
    }
    while(j <= end){
      temp[k++] = array[j++];
    }
    for(int x = 0; x < temp.length; x++){
      array[start+x] = temp[x];
    }
  }
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。