У меня есть массив чисел, например:
A = [1, 5, 2, 4, 3]
и массив, который определяет ранг, например:
B = [0, 2, 1]
Моя цель состоит в том, чтобы найти все подмассивы A, которые "подчиняются" рангу B. Если подмассив подчиняется рангу, это означает, что i-й наименьший элемент подмассива должен иметь B[i]
качестве (подмассивного) индекса. Таким образом, для соответствия подмассива наименьший элемент в нем должен быть в позиции 0, второй наименьший элемент должен быть в позиции 2, а самый большой элемент должен быть в позиции 1.
Так, например, здесь, есть два подмассива A, которые соответствуют ранжированию: [1, 5, 2] (потому что A [0] <A [2] <A [1]) и [2, 4, 3].
До сих пор мне удалось найти решение, которое имеет временную сложность O(mn)
(m is len (A) и n is len (B)), оно перебирает все подмассивы длины 3 и проверяет, являются ли они правильно заказано:
A = [1, 5, 2, 4, 3]
B = [0, 2, 1]
m = len(A)
n = len(B)
for i in range(m - n + 1):
current_subarray = A[i:i + n]
# we now do n - 1 comparaisons to check whether the subarray is correctly ordered.
for B_index in range(n - 1):
if current_subarray[B[B_index]] > current_subarray[B[B_index + 1]]:
break
else:
print("Subarray found:", current_subarray)
Результат:
Subarray found: [1, 5, 2]
Subarray found: [2, 4, 3]
Это работает, но мне было интересно, был ли лучше оптимизированный алгоритм (лучше, чем O(mn)
) для выполнения этой задачи.