数组峰值问题
一个峰值元素是指一个元素,它大于或等于它的左右邻居(如果有的话)。
问题描述
给定一个整数数组 nums
,请找出其中的一个峰值元素,并返回它的索引。
你可以假设数组的左右边界的元素永远是负无穷。
例如,nums = [1, 2, 3, 1]
,则峰值元素是 3
,返回其索引 2
。
解法思路
-
我们可以利用数组的特性,用二分查找来优化。
-
峰值的定义是:当前元素大于或等于左右邻居。
-
如果中间元素小于右邻居,则说明右边可能有峰值,因此可以将搜索范围缩小到右半部分。
-
如果中间元素小于左邻居,则说明左边可能有峰值,因此可以将搜索范围缩小到左半部分。
-
如果中间元素满足峰值条件,则返回该元素的索引。
边界
指针不重合(start < end)时才进行循环,如果左右指针指向了同一个元素时,没有比较的意义。
代码
let nums = [1, 2, 3, 1]; function find(arr,start =0, end = arr.length -1){ while(start < end){ const mid = Math.floor((start+end)/2); //中间元素比右侧大,调头检查左边 if(arr[mid] > arr[mid+1]){ end = mid; } else start = mid + 1; } return start; } console.log(find(nums));