Menu
CoddyTech

Count Inversions

ふつうソート再帰python iconjava iconcpp iconc iconjs icon+10

整数のリスト nums が与えられたとき、転倒数を返してください。転倒とは、i < j かつ nums[i] > nums[j] を満たすインデックスの組、つまり大きい値が小さい値より前にある組のことです。値が等しい場合は転倒にならず、ソート済みのリストには転倒はありません。

関数

countInversions(nums: integer-array) → integer
numsinteger-array
整数のリスト
戻り値integer
nums[i] > nums[j] である i < j の組の数

制約

  • 1 ≤ nums.length ≤ 2 × 104
  • -104 ≤ nums[i] ≤ 104
  • 答えは最大でも n(n-1)/2 < 2 × 108 なので、符号付き32ビット整数に収まります。

例

入力
nums = [5, 3, 8, 1, 4]
出力
6
説明
5は3、1、4より前にあります:3組です。3は1より前にあり、8は1と4より前にあります:さらに3組です。1と4は順番どおりなので、合計は6です。
challenge icon

発展問題

nums[i] > 2 × nums[j]の場合にのみペアとして数えると、何が変わるでしょうか?マージソートで引き続きO(n log n)でこれらのペアを数えられるでしょうか?

コードをリセット
def countInversions(nums):
    # ここにコードを書いてください

テスト #1

テスト #2

テスト #3

引数

nums = [5, 3, 8, 1, 4]

期待される出力

6