CareerCup Find at-least one triplet such that A[n-1] >= A[n] <= A[n+1].

265 篇文章 1 订阅
86 篇文章 0 订阅

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")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值