btvn.vn
Tìm kiếm Đăng nhập

Đếm cặp nghịch đảo qua hai vòng lặp

Lưu trên thiết bị này
Kĩ thuật lập trình — CS · Chọn bài khác

Cặp nghịch đảo là cặp chỉ số

Với hai vị trí `i < j`, cặp đó là **nghịch đảo** nếu `a[i] > a[j]`. Trước hết liệt kê mọi cặp vị trí bên trái–bên phải; sau đó giữ lại cặp có giá trị bên trái lớn hơn. Hai giá trị bằng nhau **không** tạo nghịch đảo. Ví dụ `a = [3, 2, 1, 5, 4]` có bốn cặp theo giá trị: `(3,2)`, `(3,1)`, `(2,1)`, `(5,4)`. Nếu có giá trị trùng, cần nói cặp theo **chỉ số** để phân biệt những lần xuất hiện.

Mỗi cặp i < j được xét đúng một lần

```python def dem_nghich_dao(a): dem = 0 for i in range(len(a) - 1): for j in range(i + 1, len(a)): if a[i] > a[j]: dem += 1 return dem print(dem_nghich_dao([3, 2, 1, 5, 4])) ``` Kết quả là `4`. Vòng trong bắt đầu ở `i + 1` để luôn có `i < j`; nếu bắt đầu cố định từ 1 thì có thể xét cả cặp sai chiều và đếm trùng. Dãy đã không giảm có 0 nghịch đảo. Dãy ba số giảm hẳn `[3, 2, 1]` có 3 nghịch đảo.

Bài luyện

Với `a = [2, 2, 1]`, có bao nhiêu cặp nghịch đảo?
Chọn một đáp án

Bài luyện

Trong mã đếm nghịch đảo, vì sao vòng trong dùng `range(i + 1, len(a))`?
Chọn một đáp án

Bài luyện

`dem_nghich_dao([3, 2, 1, 5, 4])` trả gì?
Chọn một đáp án

Đang học