Given a sequence of numbers such that A[0] >= A[1] and A[N-1] >= A[N-2] find at-least one triplet such that A[n-1] >= A[n] <= A[n+1]. Better than linear time is expected.
Example: 9 8 5 4 3 2 6 7
Answer: 3 2 6
----------------------------------------
Similar to leetcode Find Peak Element, local_min_not_recommendation is not suggested to write, although it won't go to dead loop in this code, but it may fail for other codes.
Python codes:
from itertools import chain, permutations
class Solution:
def local_min_not_recommendation(self, arr):
arr_len = len(arr)
if (arr_len < 3 or arr[0] < arr[1] or arr[arr_len-1] < arr[arr_len-2]):
return None
i, j = 0, arr_len-1
while (i < j):
mid = (i+j)>>1
if (arr[mid-1] >= arr[mid] and arr[mid] <= arr[mid+1]):
return [arr[mid-1], arr[mid], arr[mid+1]]
else:
if (arr[mid-1] < arr[mid]):
j = mid
elif (arr[mid] > arr[mid+1]):
i = mid
def local_min(self, arr):
alen = len(arr)
if (alen < 3 or arr[0] < arr[1] or arr[alen-1] < arr[alen-2]):
return None
left, right = 1, alen-2
while (left <= right):
mid = (left+right)>>1
if (arr[mid-1] >= arr[mid] and arr[mid] <= arr[mid+1]):
return [arr[mid-1], arr[mid], arr[mid+1]]
else:
if (arr[mid-1] < arr[mid]):
right = mid-1
elif (arr[mid] > arr[mid+1]):
left = mid+1
if __name__ == '__main__':
s = Solution()
for items in ((permutations([1,2,3,4,5], i) for i in range(2, 5))):
for item in items:
input = [item[0]]+list(item)+[item[-1]]
print("list={0}".format(input))
output = s.local_min(input)
print(output)
if (output[1] > output[0] or output[1] > output[2]):
print("Error")