lintcode练习 - 75. 寻找峰值

版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/82462398

75. 寻找峰值

你给出一个整数数组(size为n),其具有以下特点:

  • 相邻位置的数字是不同的
  • A[0] < A[1] 并且 A[n - 2] > A[n - 1]

假定P是峰值的位置则满足A[P] > A[P-1]A[P] > A[P+1],返回数组中任意一个峰值的位置。

样例

给出数组[1, 2, 1, 3, 4, 5, 7, 6]返回1, 即数值 2 所在位置, 或者6, 即数值 7 所在位置.

挑战

Time complexity O(logN)

注意事项

  • It's guaranteed the array has at least one peak.
  • The array may contain multiple peeks, find any of them.
  • The array has at least 3 numbers in it.

解题思路:

怎么用二分法呢?猛地想不到,就先想想left和right求取中值mid嘛,这是二分法的通用套路。然后,此时mid所指向的元素的值就分为三种情况了:

1. A[mid] > A[mid + 1] && A[mid] > A[mid - 1],那么,根据定义,mid指向的就是一个峰值

2. A[mid] < A[mid + 1],因为A[n - 2] > A[n - 1],那么,一定有一个峰值存在于[mid + 1, n - 2]

3. A[mid] < A[mid - 1],因为A[0] < A[1],那么,一定有一个峰值存在于[1, mid - 1]

也就是说,我们每次求得mid所指的值,都可以缩减峰值存在的范围。

class Solution:
    """
    @param A: An integers array.
    @return: return any of peek positions.
    """
    def findPeak(self, A):
        # write your code here
        #根据数据特点直接判断
        if A[1] > A[2]:
            return 1
        if A[len(A)-2] > A[len(A) - 3]:
            return len(A) - 2
        
        start, end = 0, len(A) - 1
        while start <= end:
            mid = (start + end) // 2
            if A[mid] > A[mid+1] and A[mid] > A[mid -1]:
                return mid
            if A[mid] < A[mid + 1]:
                start = mid + 1
            else:
                end = mid - 1
        
        return start if A[start] >= A[end] else end


    

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/82462398