【力扣】162. 寻找峰值

这里写目录标题

题目

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

示例

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2
输入:nums = [1,2,1,3,5,6,4]
输出:15 
解释:你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6

题解

我们在数组中随便找一个值,此时有三种可能
1,nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1]
符合题意 直接return出去。
2,nums[mid] < nums[mid + 1].。
此时可以肯定的是峰值肯定在 mid 的右边
3,num[mid] < nums[mid - 1]
此时可以肯定峰值肯定在 mid 的左边
为什么二三这么肯定呢?
大家可以想一想,nums[mid]肯定不是封顶了,比如第二种情况nums[mid + 1]就比它大了,那么
为什么说峰顶一定在右边呢?因为题意说边界是-∞,最坏的情况不就是右边一个比一个大直到边界那个肯定是峰顶。最好的情况就是nums[mid + 1]就比它右边那个大了,也就是峰顶了。

整体代码

    public int findPeakElement(int[] nums) {
    
    
        int left = 0,right = nums.length - 1;
        if (nums.length == 1){
    
    
            return 0;
        }
        while (left <= right){
    
    
            int mid = left + ((right - left) >> 2);
            if (mid == 0){
    
    
                if (nums[mid] > nums[mid + 1]){
    
    
                    return mid;
                }
            }else if (mid == nums.length - 1){
    
    
                if (nums[mid] > nums[mid - 1]){
    
    
                    return mid;
                }
            }else {
    
    
                if (nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1]){
    
    
                    return mid;
                }
            }
            if (nums[mid] < nums[mid + 1]){
    
    
                left = mid + 1;
            }else {
    
    
                right = mid - 1;
            }
        }
        return -1;

    }

猜你喜欢

转载自blog.csdn.net/Cuichenyang158/article/details/128920570
今日推荐