Kilka dni temu, w wywiadzie, zostałem poproszony o program, który znalazłby pojedynczy duplikat elementu w kolejnej tablicy liczb całkowitych w czasie O(log n)
.Znajdź duplikat w tablicy kolejnych liczb całkowitych w czasie O (log n)
Przypadek jest nieco specyficzny, ponieważ w sumie jest 11 liczb całkowitych (od 1 do 10, w tej kolejności) plus jeden duplikat dowolnej z tych liczb, wstawiony gdzieś pomiędzy.
dano próbkę podobną do tej:
{1, 2, 3, 4, 5, 6, , 7, 8, 9, 10}
Tak, teraz mam następujący kod C:
#include <stdio.h>
int main (void)
{
int a[11] = {1, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10}, first=0, last=10, mid;
while (1)
{
mid = (first + last)/2;
if (mid+1 == a[mid])
first = mid+1;
else if ((mid == 0) || (mid == 10) || (a[mid+1] - a[mid-1] == 1)) /* Order is Important, (a[mid+1] - a[mid-1] == 1) must be last */
break;
else
last = mid-1;
}
printf("Duplicate element is %d, located at position no. %d.", a[mid], mid+1);
return 0;
}
Czy to właściwie spełnia kryteria O(log n)
? Czy są jakieś alternatywy/ulepszenia?
Wskazówka: Zawsze używaj półotwartych przerw. BTW: A co z tymi magicznymi liczbami w elseif-brnch? – Deduplicator