about summary refs log tree commit diff
path: root/users/wpcarro/scratch/facebook/moderate/unsorted-substring.py
# Write a function that accepts an array of integers and returns the indices for
# the starting and ending integers that, if their elements were sorted, the
# entire array would be sorted.

################################################################################
# First Attempt
################################################################################

def unsorted_substring(xs):
    ys = xs[:]; ys.sort()
    m = 0
    while xs[m] == ys[m]:
        m += 1
        if m >= len(xs):
            return -1, -1
    n = len(xs) - 1
    while xs[n] == ys[n]:
        n -= 1
    return m, n

################################################################################
# Second Attempt
################################################################################

def unsorted_substring_2(xs):
    beg = 1
    while xs[beg - 1] <= xs[beg]:
        beg += 1
        if beg >= len(xs):
            return -1, -1
    end = len(xs) - 2
    while xs[end + 1] >= xs[end]:
        end -= 1

    min_mid = xs[beg]
    max_mid = xs[beg]
    i = beg + 1
    while i <= end:
        min_mid = min(min_mid, xs[i])
        max_mid = max(max_mid, xs[i])
        i += 1

    # beg -= 1 until max(lhs) <= min(mid)
    while beg - 1 >= 0 and xs[beg - 1] >= min_mid:
        beg -= 1

    # end += 1 while max(mid) <= min(rhs)
    while end + 1 < len(xs) and max_mid >= xs[end + 1]:
        end += 1
    return beg, end

################################################################################
# Tests
################################################################################

xs = [
    [1,2,4,7,10,11,7,12,6,7,16,18,19],
    [1,2,3,4],
    [4,3,2,1],
    [1,3,2,4],
    [2,1,3,4],
]

for x in xs:
    print("Testing: {}".format(x))
    print("1) {}".format(unsorted_substring(x)))
    print("2) {}".format(unsorted_substring_2(x)))