thể trùng lặp:
Counting inversions in an arrayLàm cách nào để tìm số lần đảo ngược trong một mảng?
Đây là một phone interview question: "Tìm số đảo trong một mảng". Tôi đoán họ có nghĩa là giải pháp O (N log N). Tôi tin rằng nó không thể tốt hơn O (N log N) vì đây là sự phức tạp phân loại.
Câu trả lời cho một similar question có thể được tóm tắt như sau:
- Tính nửa khoảng cách các yếu tố cần được di chuyển để sắp xếp mảng: sao chép mảng và sắp xếp các bản sao. Đối với mỗi phần tử của mảng gốc
a[i]
, hãy tìm vị trí của nój
trong bản sao đã sắp xếp (tìm kiếm nhị phân) và tính tổng một nửa khoảng cáchabs(i - j)/2
. Sửa đổi
merge sort
: sửa đổimerge
để đếm đảo ngược giữa hai mảng được sắp xếp và chạy thường xuyênmerge sort
với sửa đổimerge
.Có hợp lý không? Có giải pháp nào khác (có thể đơn giản hơn) không? Không phải là quá khó khăn cho một cuộc phỏng vấn qua điện thoại sao?
Bạn có thể tìm thấy giải pháp n log n được mã hóa bằng java tại đây: http: // stackoverflow.com/questions/337664/count-invers-in-an-array/6424847 # 6424847 –