leetcode(162)---寻找峰值(二分查找)

Posted 叶卡捷琳堡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode(162)---寻找峰值(二分查找)相关的知识,希望对你有一定的参考价值。

一、题目

162.寻找峰值

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

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

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

示例 1:

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2

示例 2:

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

提示:

1 <= nums.length <= 1000
-231 <= nums[i] <= 231 - 1
对于所有有效的 i 都有 nums[i] != nums[i + 1]

进阶:你可以实现时间复杂度为 O(logN) 的解决方案吗?

二、题解

递归二分法,如果mid处于上升状态,则峰值在右边。如果mid处处于下降状态,则峰值在左边

class Solution 
{
    public int findPeakElement(int[] nums) 
    {
        int left = 0;
        int right = nums.length - 1;
        //数组长度为1
        if(nums.length == 1){
            return 0;
        }
        //数组长度为2
        if(nums.length == 2){
            if(nums[left] > nums[right]){
                return left;
            }
            else{
                return right;
            }
        }
        //峰值在首尾
        if(nums[0] > nums[1]){
            return 0;
        }
        if(nums[nums.length-1] > nums[nums.length-2]){
            return nums.length-1;
        }
        while(true){
            int mid = (left + right) / 2;
            if(nums[mid-1] < nums[mid] && nums[mid] > nums[mid+1]){
                return mid;
            }
            //峰值在left-mid间
            if(nums[left] >= nums[mid]){
                right = mid;
            }
            else{
                left = mid;
            }
        }
    }
}

以上是关于leetcode(162)---寻找峰值(二分查找)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode No.162 寻找峰值(二分查找)

162. 寻找峰值二分查找

162. 寻找峰值二分查找

LeetCode 162 寻找峰值[二分法] HERODING的LeetCode之路

LeetCode 162. 寻找峰值(二分)/ 212. 单词搜索 II(Trie字典树) / 36. 有效的数独

leetcode - 二分查找