findPeakElement [leetcode 162]

https://leetcode.com/problems/find-peak-element/

image.png

(图片来源
image.png

日期 是否一次通过 comment
2019-11-24

数组可能是以下几个情况的组合:

  1. 单调递增 --- 最后一个是波峰
  2. 先增后减 --- 中间是波峰
  3. 单调递减 --- 第一个是波峰
  4. 先减后增 --- 第一个是波峰

暴搜 or 二分查找都可

public int findPeakElement(int[] nums) {
        for(int i=1; i<= nums.length-1; i++) {
            if(nums[i] < nums[i-1]) {
                return i-1;
            }
        }

        return nums.length-1;
    }

    public int findPeakElement1(int[] nums) {
        if(nums == null || nums.length <= 1){
            return 0;
        }
        int sta = 0, end = nums.length - 1;
        while(sta + 1 < end){  // 保证sta和end中间一定有一个元素;mid+1一定不会越界
            int mid = sta + (end - sta)/2;
            if(nums[mid] < nums[mid + 1]){
                sta = mid;
            } else {
                end = mid;
            }
        }

        if(nums[sta] > nums[end]) {
            return sta;
        }

        return end;
    }

你可能感兴趣的:(findPeakElement [leetcode 162])