首页 > 试题广场 >

寻找峰值

[编程题]寻找峰值
  • 热度指数:162827 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] =
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:



如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:
示例1

输入

[2,4,1,2,7,8,4]

输出

1

说明

4和8都是峰值元素,返回4的索引1或者8的索引5都可以     
示例2

输入

[1,2,3,1]

输出

2

说明

3 是峰值元素,返回其索引 2     
假设有个最大值,由于规定3,左右一定不等,一定是峰值,返回下标就好了
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        return nums.index(max(nums))
编辑于 2024-03-07 20:13:31 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        target=max(nums)

        return nums.index(target)
发表于 2023-12-24 15:13:01 回复(1)
一知半解,懵逼
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        begin_index = 0
        end_index = len(nums) -1
        while begin_index < end_index:
            center_index = (begin_index+end_index) // 2
            center_num = nums[center_index]
            if center_num > nums[center_index + 1]:
                end_index = center_index
            else:
                begin_index = center_index +1
        return begin_index


发表于 2023-10-13 09:54:57 回复(0)

要找到数组中的峰值,可以使用二分法进行查找。以下是使用二分法查找峰值的步骤:

  1. 初始化左指针 l 和右指针 r,分别指向数组的开始和结束位置。

  2. 进入循环,直到找到峰值或退出循环:

    • 计算中间指针 m,即索引为 (l + r) // 2。
    • 比较 nums[m] 和 nums[m+1] 的值:
      • 如果 nums[m] < nums[m+1],则说明峰值在右侧,更新 l = m + 1。
      • 如果 nums[m] > nums[m+1],则说明峰值在左侧或当前位置就是峰值,更新 r = m。
      • 如果 nums[m] == nums[m+1],则说明两侧都可能存在峰值,任意选择一个方向继续查找即可。
  3. 返回 l 或 r,即找到的峰值的索引。

这种二分法的时间复杂度为 O(logN),满足要求。

需要注意的是,由于题目中给出了假设条件,即 nums[-1] = nums[n] = -∞,数组的两个边界元素的值都是负无穷小,因此在边界上没有峰值。除了边界,其他位置都有可能存在峰值

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型
#
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        l,r = 0,len(nums) - 1
        while l < r:
            m = (l + r) // 2
            if nums[m] < nums[m+1]:
                l = m + 1
            else:
                r = m
        return l

发表于 2023-09-20 15:28:53 回复(1)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        left,right = 0,len(nums)-1
        while left<right:
            mid = (left+right)//2
            if nums[mid] < nums[mid+1]: left = mid+1
            else: right = mid
        return left

发表于 2021-12-25 17:53:09 回复(3)

问题信息

上传者:牛客301499号
难度:
5条回答 5679浏览

热门推荐

通过挑战的用户

查看代码