2013-06-14 47 views
7

Nguồn: Phỏng vấn Microsoft Câu hỏiTìm các yếu tố không trùng lặp trong một mảng được sắp xếp

Cho một mảng được sắp xếp, trong đó mọi phần tử có mặt hai lần trừ một trong đó có mặt lần duy nhất, chúng ta cần phải tìm yếu tố đó .

Bây giờ một O tiêu chuẩn (n) Giải pháp là để làm một XOR của danh sách, mà sẽ trở lại các yếu tố không trùng lặp (vì tất cả các yếu tố lặp lại hủy bỏ ra.)

Có thể giải quyết việc này một cách nhanh chóng hơn nếu chúng ta biết mảng được sắp xếp?

+7

Thực hiện tìm kiếm nhị phân "" (thay vì traversal) trên mảng, kiểm tra cả hai hàng xóm, nếu bot khác với giá trị trung bình, bạn có giải pháp. Đây là 'O (log n)'. –

+0

@ H2CO3 như thế nào? Chẳng phải hàng xóm luôn khác nhau sao? –

+0

@ZiyaoWei Nopeeeee! Tôi không nói tiếng Anh. Nếu mảng được sắp xếp, ('1 1 2 2 3 4 4'), thì một hàng xóm giống với giá trị trung tâm. –

Trả lời

14

Có, bạn có thể sử dụng sắp xếp để giảm độ phức tạp xuống O(log n) bằng cách thực hiện tìm kiếm nhị phân.

Vì mảng được sắp xếp, trước phần tử bị thiếu, mỗi giá trị chiếm các vị trí 2*k2*k+1 trong mảng (giả sử chỉ mục dựa trên 0).

Vì vậy, bạn hãy vào giữa mảng, nói index h, và kiểm tra một trong hai chỉ số h+1 nếu h là chẵn hay h-1 nếu h là số lẻ. Nếu phần tử bị thiếu đến sau, các giá trị tại các vị trí này bằng nhau, nếu nó đến trước, các giá trị khác nhau. Lặp lại cho đến khi phần tử bị thiếu nằm.

+3

Thật tuyệt vời. Câu trả lời chính xác! – templatetypedef

+1

Và bây giờ bạn đang nhận được upvoted cho câu trả lời tôi đăng trong bình luận của tôi 3 phút trước đây. Sill me :) –

+3

@ H2CO3 Nhưng anh ấy giải thích thuật toán rõ hơn :) –

6

Thực hiện tìm kiếm nhị phân "" (thay vì traversal) trên mảng, kiểm tra cả hai hàng xóm, nếu cả hai đều khác với giá trị ở giữa, bạn có giải pháp. Đây là O(log n).

+0

nếu cả hai đều giống nhau, sau đó? .. tôi chuyển sang trái hoặc phải? – Spandan

+1

bạn không hiểu câu hỏi d, tôi nghĩ! – Spandan

+2

@ Spandan Tôi hiểu nó hoàn hảo. –

Các vấn đề liên quan