Menu
CoddyTech

Count Inversions

Trung bìnhSắp xếpĐệ quypython iconjava iconcpp iconc iconjs icon+10

Cho một danh sách số nguyên nums, hãy trả về số lượng nghịch thế: các cặp chỉ số i < j sao cho nums[i] > nums[j], tức là một giá trị lớn hơn đứng trước một giá trị nhỏ hơn. Các giá trị bằng nhau không bao giờ tạo thành nghịch thế, và một danh sách đã sắp xếp thì không có nghịch thế nào.

Hàm

countInversions(nums: integer-array) → integer
numsinteger-array
danh sách số nguyên
Trả vềinteger
số cặp i < j thỏa mãn nums[i] > nums[j]

Ràng buộc

  • 1 ≤ nums.length ≤ 2 × 104
  • -104 ≤ nums[i] ≤ 104
  • Đáp án có giá trị tối đa là n(n-1)/2 < 2 × 108, nên có thể biểu diễn bằng số nguyên có dấu 32 bit.

Ví dụ

Đầu vào
nums = [5, 3, 8, 1, 4]
Đầu ra
6
Giải thích
5 đứng trước 3, 1 và 4: 3 cặp. 3 đứng trước 1, và 8 đứng trước 1 và 4: thêm 3 cặp. 1 và 4 đúng thứ tự, vậy tổng cộng là 6.
challenge icon

Câu hỏi mở rộng

Nếu một cặp chỉ được tính khi nums[i] > 2 × nums[j], thì điều gì thay đổi? Merge sort vẫn có thể đếm những cặp đó trong O(n log n) không?

Đặt lại code
def countInversions(nums):
    # Viết code ở đây

Kiểm thử #1

Kiểm thử #2

Kiểm thử #3

Đối số

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

Đầu ra mong đợi

6