Tôi đã nhận được một mảng (gồm n phần tử) và tôi phải tìm phần tử nhỏ nhất ở bên phải của mỗi phần tử lớn hơn chính nó (phần tử hiện tại).Phần tử lớn nhất hiện diện ở phía bên phải của mỗi phần tử trong một mảng
For example :
Array = {8,20,9,6,15,31}
Output Array = {9,31,15,15,31,-1}
Có thể giải quyết vấn đề này trong O(n)
.? Tôi nghĩ rằng đi qua mảng từ phía bên phải (bắt đầu từ n-2) và xây dựng cây tìm kiếm nhị phân cân bằng cho các phần tử còn lại, như tìm kiếm trong phần tử đó ngay lập tức lớn hơn phần tử hiện tại sẽ là O (logn).
Do đó thời gian phức tạp sẽ đến ra là O (n * (log (n)).
Có một cách tiếp cận tốt hơn cho vấn đề này?
Điều này không tương đương với việc sắp xếp, tìm vị trí của bất kỳ phần tử 'a' là những gì bạn làm trong quicksort trong mỗi bước, và nó được thực hiện ở đó trong O (n). Hay tôi đã hiểu sai sự suy giảm của bạn từ việc phân loại? – amit
Có vẻ tốt với tôi, ít nhất là để phân loại các số riêng biệt (mà tôi khá chắc chắn là đủ? Tôi không biết). @amit: Sau khi chạy thuật toán trên 'v' và' reverse (v) ', đối với mỗi phần tử, bạn biết chỉ mục của phần tử sẽ xuất hiện bên phải của nó (đó là phần tử nhỏ nhất tiếp theo bên phải hoặc phần tử tiếp theo yếu tố nhỏ nhất bên trái của nó). Vì vậy, từ bất kỳ phần tử khởi đầu nào i, bạn có thể xây dựng một phần của giải pháp có chỉ mục> = i trong thời gian O (1) cho mỗi phần tử. Lật dấu và lặp lại sẽ cho bạn phần bên trái (tức là có chỉ mục <= i). –
OK, nghĩ rằng bạn đang nhận được vị trí * đơn * của một phần tử, có thể làm được trong O (n). cảm ơn vì đã làm rõ. – amit