题解 | 寻找峰值

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     [1]
     [1,2]
     [2,1]
     [1,2,3]
     [2,4,1,2,7,8,4]
     [1,3,2]
     [3,1,2]
     */
    public int findPeakElement (int[] nums) {
        if (nums.length == 0) {
            return -1;
        }
        if (nums.length == 1) {
            return 0;
        }
        int start = 0;
        int end = nums.length;
        while (start <= end) {
            int mid = start + (end - start) / 2;
            if (mid == 0) {
                if (nums[0] > nums[1]) {
                    return 0;
                } else {
                    start = mid+1;
                    continue;
                }
            } 
             if (mid == nums.length -1) {
                if (nums[mid] > nums[mid -1]) {
                    return mid;
                } else {
                    end = mid-1;
                    continue;
                }
            }
            if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
                return mid;
            } else if (nums[mid] < nums[mid - 1]) {
                end = mid - 1;
            } else if (nums[mid] < nums[mid + 1]) {
                start = mid + 1;
            }
        }
        return -1;
    }
}

知识点:

  1. 看到logN就想到二分查找法,切记!!!

再看看题目的提示,nums【i】 != nums【i+1】,另外就是还有个条件,你循环的时候你会发现,如果num【i】> nums[i-1],那么nums[i]很可能就是峰值,除非他是单调递增的 nums[i+1] > nums[i],且nums[i+2] > nums[i+1]一直增加上去,一直遇到第一个小的就结束了。

这么想想,用二分查找去做久自然能想通了,如果mid比左边的大,说明峰值在右边,如果mid比右边的大,说明峰值在左边。

比较难搞的是边界条件很难写,mid-1可能搞成负值。mid+1也可能越界,因此单独提出来。

全部评论

相关推荐

02-21 23:27
已编辑
武汉大学 产品运营
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务