寻找峰值
https://www.lintcode.com/problem/75/description?utm_source=sc-libao-ql
描述
给定一个长度为 n
的整数数组 nums
,其具有以下特点:
相邻位置的数字是不同的
nums
至少存在一个峰值
假定 P 是峰值的位置则满足 nums[P] > nums[P-1]
且 nums[P] > nums[P+1]
,返回数组中任意一个峰值的位置。
数组保证至少存在一个峰
如果数组存在多个峰,返回其中任意一个就行
数组至少包含 3 个数
样例
样例 1:
输入:
输出:
解释:
返回任意一个峰顶元素的下标,6也同样正确。 样例 2:
输入:
输出:
解释:
返回峰顶元素的下标。
挑战
时间复杂度
分析:
选择中点: 首先,选择数组的中间位置mid。
比较中点与其右邻居:
如果 nums[mid]>nums[mid+1],说明峰值在中点左边或者中点本身是峰值,因为在这种情况下,左侧肯定有一个上升趋势(包括中点本身)。
如果 nums[mid]<nums[mid+1],说明峰值在中点右边,因为右侧有一个上升趋势,这意味着峰值必定在右边。
缩小搜索范围: 根据上述比较结果,我们可以缩小搜索区间至中点左边或右边,继续用二分法搜索,直到找到一个峰值。
Last updated