Leetcode:162. 寻找峰值

Leetcode:162. 寻找峰值

题目描述

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

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

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

示例 1:

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

示例 2:

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

说明:

你的解法应该是 O(logN) 时间复杂度的。

思路

思路1 遍历

直接遍历,遍历元素是否大于下一个元素,若大于则返回(从数组列表开始)

思路2: 二分法

可用二分法找峰值,若找的元素大于右侧元素,则需要峰值的元素在mid元素左侧,若小于右侧则为mid右侧

代码

代码1

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

代码二

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

复杂度分析

思路1时间复杂度

$O(n)$

思路1空间复杂度

$O(1)$

思路2时间复杂度

$O(logn)$

思路2空间复杂度

$O(1)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:287. 寻找重复数 Leetcode:287. 寻找重复数
Leetcode:287. 寻找重复数题目描述给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 示例 1:输入: [
2020-04-17
下一篇 
Leetcode:324. 摆动排序 II Leetcode:324. 摆动排序 II
Leetcode:324. 摆动排序 II题目描述给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。 示例 1:输入: nums =
2020-04-16
  目录