`

Leetcode - Find Peak Element

 
阅读更多
[分析] 暴力法,按序扫描数组,找到peak element。提示说复杂度可以是logN级别的,那就要二分查找了,如何进行二分呢?考察nums[mid]和其左右相邻元素:若nums[mid] < nums[mid + 1], 则右侧必存在一个局部最大值,简略证明:若右侧一直是升序,则最后一个元素是peak element, 否则,第一次升序的波峰处是一个peak element。同理,若num[mid] < nums[mid - 1], 则左侧必存在一个局部最大值。若前面两种情况都不成立,则mid处就是一个局部最大值。

public class Solution {
    public int findPeakElement1(int[] nums) {
        if (nums == null || nums.length == 0)
            return -1;
        if (nums.length == 1)
            return 0;
        int N = nums.length;
        for (int i = 1; i < N - 1; i++) {
            if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
                return i;
        }
        if (nums[0] > nums[1])
            return 0;
        else if (nums[N - 1] > nums[N - 2])
            return N - 1;
        else
            return -1;
    }
    
    public int findPeakElement(int[] nums) {
        if (nums == null || nums.length == 0)
            return -1;
        if (nums.length == 1 || nums[0] > nums[1])
            return 0;
        int N = nums.length;
        int left = 0, right = N - 1;
        while (right >= left) {
            if (left == right)
                return left;
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums[mid + 1]) 
                left = mid + 1;
            else if (nums[mid] < nums[mid - 1])
                right = mid - 1;
            else
                return mid;
        }
        return -1;
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics