Solve unsorted-substring a second time
This solution operates in O(n) time instead of O(n*log(n)) time, which surprisingly isn't *that* big of a difference... Consider a size of n of 10M... 1) ~10s 2) ~0.5s So, yes, the O(n*log(n)) will take 100x longer to complete, but for an enormous input size of 10M elements, it can still complete in under a minute. The difference between that and the second, faster, algorithm, is just 9s.
This commit is contained in:
parent
48fde5f278
commit
a0e9e2b310
1 changed files with 51 additions and 5 deletions
|
@ -2,6 +2,10 @@
|
||||||
# the starting and ending integers that, if their elements were sorted, the
|
# the starting and ending integers that, if their elements were sorted, the
|
||||||
# entire array would be sorted.
|
# entire array would be sorted.
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# First Attempt
|
||||||
|
################################################################################
|
||||||
|
|
||||||
def unsorted_substring(xs):
|
def unsorted_substring(xs):
|
||||||
ys = xs[:]; ys.sort()
|
ys = xs[:]; ys.sort()
|
||||||
m = 0
|
m = 0
|
||||||
|
@ -14,8 +18,50 @@ def unsorted_substring(xs):
|
||||||
n -= 1
|
n -= 1
|
||||||
return m, n
|
return m, n
|
||||||
|
|
||||||
print(unsorted_substring([1,2,4,7,10,11,7,12,6,7,16,18,19]))
|
################################################################################
|
||||||
print(unsorted_substring([1,2,3,4]))
|
# Second Attempt
|
||||||
print(unsorted_substring([4,3,2,1]))
|
################################################################################
|
||||||
print(unsorted_substring([1,3,2,4]))
|
|
||||||
print(unsorted_substring([2,1,3,4]))
|
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)))
|
||||||
|
|
Loading…
Reference in a new issue