题解 | #寻找峰值#

寻找峰值

https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76

  1. nums[mid] < nums[mid+1] :右边一定是存在峰值的 因为从mid开始的单调性要么是/\ (先增后减)要么是/ (单调递增)都有峰值 因为nums[-1] nums[n]都是负无穷
  2. nums[mid] > nums[mid-1] :左边的单调性/(从mid往左单调递减) \/ (从mid往左先减后增)从mid往左递减不存在峰值 先减后增 那么nums[0]是峰值

package main
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
*/
func findPeakElement( nums []int ) int {
    // write code here
    if len(nums) == 1 {
        return 0
    }
    left, right, n := 0, len(nums) - 1, len(nums)
  
    const INF = ^int(^uint(0) >> 1)
    for left <= right {
        mid := (left + right) >> 1
        l, r := INF, INF
        if mid - 1 >= 0 {
            l = nums[mid - 1]
        }
        if mid + 1 < n {
            r = nums[mid + 1]
        }
        if nums[mid] > l && nums[mid] > r {
            return mid
        }
        if nums[mid + 1] > nums[mid] {
            //右边一定是存在峰值的  因为从mid开始的单调性要么是/\ 要么是/ 都有峰值 因为nums[-1] nums[n]都是负无穷
            left = mid + 1
        }else {
            //左边的单调性/ \/ 从mid往左递减不存在峰值  先减后增 那么nums[0]是峰值
            right = mid - 1
        }
    }
    return right
}
全部评论

相关推荐

2025-12-15 14:25
云南大学 Java
lei22:入职可能会看学信网,最好别伪装,这个简历找实习肯定是够的,肯定会有收 28 届实习生的公司的,多投就行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务