Есть ли алгоритм со сложностью O(n) для нахождения минимального количества перестановок элементов массива 1, чтобы массив 1 стал равен массиву 2?
Есть 2 массива, элементы которых от 1 до n:
current_array = [1, 3, 5, 2, 4, 7, 6]
expected_array = [6, 2, 4, 1, 3, 5, 7]
Чтобы current_array стал равен expected_array за минимальное количество перестановок элементов current_array влево, нужно переставить 3 элемента:
current_array -> [4, 1, 3, 5, 2, 7, 6] -> [2, 4, 1, 3, 5, 7, 6] -> [6, 2, 4, 1, 3, 5, 7]
[6, 2, 4, 1, 3, 5, 7] == expected_array
Переставить - значит, подвинуть элемент t на p позиций влево, где p не больше, чем текущее количество элементов слева от t.
Чтобы найти минимальное количество перестановок, я написал такой код:
n = 7
current_array = [1, 3, 5, 2, 4, 7, 6]
expected_array = [6, 2, 4, 1, 3, 5, 7]
counter = 0
for i in range(n):
if current_array[i] != expected_array[i]:
current_array.remove(expected_array[i])
current_array.insert(i, expected_array[i])
counter += 1
print(counter)
Но его сложность O(n^2), что довольно медленно. Я думал использовать расстояние Левенштейна, но его сложность при равных массивах тоже будет равна O(n^2).
Есть ли алгоритм для этой задачи, сложность которого будет O(n)?