数组峰值问题

一个峰值元素是指一个元素,它大于或等于它的左右邻居(如果有的话)。

问题描述

给定一个整数数组 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));

 

posted @ 2025-03-25 20:21  我是格鲁特  阅读(14)  评论(0)    收藏  举报