Дано:
Список A отсортирован, и все элементы уникальны, что означает, что Список A строго увеличивается .
Предполагая, что список A является нулевым индексом.
Наблюдение:
Предположим, что мы собираемся построить список B, для которого каждый элемент индекс i равен A [i] -i. Вы заметите, что список B всегда увеличивается (не строго).
Доказательство:
Для списка A
предположим, что элемент at (i) -й индекс будет x.
B [i] = xi
Тогда элемент с (i + 1) -м индексом будет больше x с минимумом (x + 1).
Итак, минимальное значение B [i + 1] = (x + 1) - (i + 1) = xi.
Итак, в худшем случае в списке B значение at (i +1) -й индекс будет равен значению в (i) -м индексе.
Пример:
Список A = [1,2,3,4, 5,6,8,18,20] # Строго возрастает
Список B = [1,1,1,1,1,1,2,11,12] # Увеличивается
Решение:
Поскольку нам нужно решить эту проблему за время O (log (n)), мы не должны создавать список B, в то время как мы должны использовать список A и индексы при выполнении двоичного поиска.
Это условие A [mid] - mid .
# Function performing binary Search
def binarySearch(c, A):
low = 0
high = len(A) - 1
while low <= high:
mid = low + (high-low+1)//2
if A[mid]-mid > c:
high = mid - 1
else:
low = mid + 1;
return high;
A = [1,2,3,4,5,6,8,18,20]
num_Values = binarySearch(1, A)+1
# Number of values satisfying the condition (A[index] - index <=c)
print(num_Values)
# printing the values
for i in range(num_Values):
print(A[i],end=" ")