ソードフィンガーオファー—51。アレイ内の逆ペア—分析とコード(Java)

Swordはoffer-51を指します。配列内の逆ペア-分析とコード[Java]

1.タイトル

配列内の2つの数値の場合、最初の数値が次の数値より大きい場合、2つの数値は逆のペアを形成します。配列を入力し、この配列の逆ペアの総数Pを見つけ、1000000007を法とするPの結果を出力します。つまり、P%1000000007が出力されます。
入力の説明:
タイトルは、入力配列にない同じ番号を保証します

データ範囲:

  • %50データの場合、サイズ<= 10 ^ 4
  • %75データの場合、サイズ<= 10 ^ 5
  • %100データの場合、サイズ<= 2 * 10 ^ 5

例1:
入力

1,2,3,4,5,6,7,0

出力

7

2、分析とコード

1.マージソート

(1)考える

この質問は、マージと並べ替えのアイデアを組み合わせることで解決できます:各マージプロセスで(小さいものから大きいものへの並べ替えを想定)、大きい数字が小さい後ろの数字と前側から新しい位置に交差すると、超えた小さい桁の数は逆の順序ですペアの数。
質問プロンプトと組み合わせると、この質問の結果はより大きくなる可能性があります。これは、各累積の後にモジュロ演算を実行することで解決できます。

(2)コード

public class Solution {
    
    
    public int InversePairs(int [] array) {
    
    
        if (array == null || array.length == 0)
            return 0;
        return Sort(array, 0, array.length);
    }
    
    public int Sort(int[] array, int left, int right) {
    
    
        if (right - left < 2)
            return 0;
        
        int mid = (left + right) >> 1;
        int num = 0;
        num += Sort(array, left, mid);
        num += Sort(array, mid, right);
        
        int [] tempArray = new int[right - left];
        int l = left, r = mid;
        for (int i = left; i < right; i++) {
    
    
            if (r == right || (l < mid && array[l] < array[r])) {
    
    
                tempArray[i - left] = array[l++];
            } else {
    
    
                tempArray[i - left] = array[r++];
                num += mid - l;
                num %= 1000000007;
            }
        }
        
        for (int i = left; i < right; i++)
            array[i] = tempArray[i - left];
        return num;
    }
}

(3)結果

実行時間:464ms、占有メモリ:50408k。

3、その他

何もありません。

おすすめ

転載: blog.csdn.net/zml66666/article/details/110410206