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 所在位置.

思想:此题比较简单,若要实现o(logn)的时间复杂度,则用双指针左右同时遍历即可。

题中条件保证了左右至少各有一个峰值,所以才能使用二分法实现O(log(n))的复杂度,否则只能使用遍历法,时间复杂度为O(n)

仔细想想,是否可以用二分法做,因为A[0] < A[1] 并且 A[n - 2] > A[n - 1],而且相邻位置数字不同,故至少有一端会出现峰值

方法-(双指针):

 

class Solution {
public:
    /*
     * @param A: An integers array.
     * @return: return any of peek positions.
     */
    int findPeak(vector& A) {
        // write your code here
      int start=1,end=A.size()-2;
      while(start<=end)
        {
            if(A[start]>A[start-1]&&A[start]>A[start+1])
            return start;
            else start++;
            if(A[end]>A[end-1]&&A[end]>A[end+1])
            return end;
            else end--;
        }
        return -1;
    }
};

我的代码(二分法):有点不好思考,但确实存在这样一个规律

 

class Solution {
public:
    /*
     * @param A: An integers array.
     * @return: return any of peek positions.
     */
    int findPeak(vector& A) {
        // write your code here
      int start=1,end=A.size()-2;
      while(start<=end)
        {
           int mid=start+(end-start)/2;
           if(A[mid]>A[mid+1])
           {
               if(A[mid]>A[mid-1])
                return mid;
                else end=mid-1;//左侧存在峰值
            }
            else start=mid+1;//右侧存在峰值
        }
        return -1;
    }
};

 

 


 

 

 

你可能感兴趣的:(linkcode)