The array consists of 3 parts left, middle, right. Initially left is the increasing sequence from beginning and right is the decreasing sequence from end. The left and right parts shrink till the following condition is met.
end(left) <= min(middle) && max(middle) <= start(right)
//example l r 134558-58-4889 |455-58-8| min:4 max:8 l r 123-2 |2-3| min:2, max:3 l r 4-32-1 |1-23-4| min:1, max:4
// assume a is increasing
(a):
// left
left = leftindex(a)
// right
right = rightindex(a)
// return if already sorted
if left > right:
return null, null
// min, max
min, max = minmax(a, left, right)
// shrink left, right
left, right = shrink(a, left, right, min, max)
// return
return left+1, right-1
leftindex(a):
left = 0
while left+1 < a.length && a[left] <= a[left+1]:
left++
return left
rightindex(a):
right = a.length-1
while right-1 >= 0 && a[right-1] <= a[right]:
right--
return right
minmax(a, start, end):
min = max = a[start]
for i = start, i <= end, i++:
if a[i] < min:
min = a[i]
if a[i] > max:
max = a[i]
return min, max
shrink(a, left, right, min, max):
while left >= 0 && a[left] > min:
left--
while right < a.length && a[right] < max:
right++
return left, right
[Hat tip to ctci]
No comments:
Post a Comment