leetcode.852 山脉数组的峰顶索引

我们把符合下列属性的数组 A 称作山脉:

  • A.length >= 3
  • 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]

给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] 的 i 的值。

示例 1:

输入:[0,1,0]
输出:1

示例 2:

输入:[0,2,1,0]
输出:1

提示:

  1. 3 <= A.length <= 10000
  2. 0 <= A[i] <= 10^6
  3. A 是如上定义的山脉

思路一:遍历得出下数组中最大的数,并返回其下标。

代码:

class Solution {
    public int peakIndexInMountainArray(int[] A) {
        int max = A[0];
        int a = -1;
        for(int i = 1; i < A.length; i++){
            if(A[i] > max) {
                max = A[i];
                a = i;
            }
        }
        return a;
    }
}

思路二:利用二分的思想,从 0 到 A.length - 1 遍历并判断:如果得出的 mid 中位数的值大于左边的数,而小于右边的数,就将区间变为 mid ~ A.length-1,不然的话就是在 0 ~ mid 中继续找,知道找到 mid 的值大于前一个数和后一个数。

代码:

class Solution {
    public int peakIndexInMountainArray(int[] A) {
        return find(0, A.length-1, A);
    }
    
    private int find( int i, int j, int[] A ){
        int mid = (i+j)/2;
        if( A[mid-1] < A[mid]  && A[mid] < A[mid+1]){
            return find(mid, j, A);
        }else if( A[mid-1] < A[mid]  && A[mid] > A[mid+1] ){
            return mid;
        }else{
            return find(i, mid, A);
        }
    }
    
}

猜你喜欢

转载自blog.csdn.net/weixin_40904220/article/details/84062889