Итак, у вас есть список размера N, и вы знаете, что элементы в списке находятся в диапазоне min .. min+N-1
.
Существует простой линейный алгоритм времени, который требует O (1) пробела.
Сначала отсканируйте список, чтобы найти минимальные и максимальные элементы.
Если (max - min + 1) < N
, то вы знаете, что есть дубликат. В противном случае ...
Поскольку диапазон равен N, минимальный элемент может быть равен a[0]
, а максимальный элемент - a[n-1]
. Вы можете сопоставить любой элемент с его положением в массиве, просто вычтя min
. Вы можете выполнить сортировку на месте в O (n), потому что вы точно знаете, куда должен идти каждый элемент.
Начиная с начала списка, возьмите первый элемент и вычтите min
, чтобы определить, куда он должен идти. Перейдите в эту позицию и замените предмет, который там есть. С новым элементом вычислите, куда он должен идти, и замените элемент в этой позиции и т. Д.
Если вы когда-нибудь дойдете до точки, где вы пытаетесь разместить элемент на a[x]
, и уже существует значение, то есть предполагается , которое должно быть там (то есть a[x] == x+min
), то вы нашли дубликат.
Код для всего этого довольно прост:
Исправленный код.
min, max = findMinMax()
currentIndex = 0
while currentIndex < N
temp = a[currentIndex]
targetIndex = temp - min;
// Do this until we wrap around to the current index
// If the item is already in place, then targetIndex == currentIndex,
// and we won't enter the loop.
while targetIndex != currentIndex
if (a[targetIndex] == temp)
// the item at a[targetIndex] is the item that's supposed to be there.
// The only way that can happen is if the item we have in temp is a duplicate.
found a duplicate
end if
save = a[targetIndex]
a[targetIndex] = temp
temp = save
targetIndex = temp - min
end while
// At this point, targetIndex == currentIndex.
// We've wrapped around and need to place the last item.
// There's no need to check here if a[targetIndex] == temp, because if it did,
// we would not have entered the loop.
a[targetIndex] = temp
++currentIndex
end while
Это основная идея.