TADM2E 4.34

From Algorithm Wiki
Jump to: navigation, search

Assume array indices are zero based, use modified binary search to find the smallest integer missing:

    // Trivial case 1
    if(A[0] > 1)
        return 1;
    // Trivial case 2: elements in the array are continuous from 1 to n, the smallest missing integer must be n + 1
    else if(A[n - 1] == n)
        return n + 1;
    // there is a gap in A, find the gap that is smallest
        return findGap(A, 0, n - 1);

FindGap(A, first, last):
    // only two elements left, the smallest gap must be the integer right after A[first]
    if(last == first + 1)
        return A[first] + 1;
    // recursively looking for the partition containing the smallest gap
       mid = (first + last) / 2;
       // first half doesn't have gap, looking for gap in the second half
       if(A[mid] - A[first] == mid - first)
           return findGap(A, mid, last);
       // looking for the gap in the first half
           return findGap(A, first, mid);           

If there were no gaps, Ai would be i. If we tested the mid-point (mid=n/2) and we found that Amid = mid, we would know that the gap is somewhere on the right side of the midpoint. If not, we know the gap is on the left side. We then recurse to find the gap. --Ajitq (talk) 10:01, 5 May 2018 (UTC)