📜  门| GATE-CS-2009 |第 34 题(1)

📅  最后修改于: 2023-12-03 15:42:16.784000             🧑  作者: Mango

题目描述

给定长度为 n 的数组 arr,找到数组中的峰值元素。峰值元素是大于或等于其相邻元素的元素。

例如,在数组 [1, 2, 3, 1] 中, 3 是一个峰值元素,而在数组 [1, 2, 3, 4] 中, 4 是一个峰值元素。

请注意,数组可能包含多个峰值元素,您需要返回其中任何一个。

实现函数 int FindPeakElement(int[] arr, int n)

输入
  • 一个整数数组 arr,表示给定的数组。
  • 一个整数 n,表示数组的长度。
输出
  • 返回一个整数,表示数组中的峰值元素下标。
示例
输入:arr = [1, 2, 3, 1], n = 4
输出:2
解释:数组 arr 中的 3 是一个峰值元素,其下标为 2。

输入:arr = [1, 2, 1, 3, 5, 6, 4], n = 7
输出:1 或 5
解释:数组 arr 中的 2 或 6 是峰值元素,其下标分别为 1 和 5。

输入:arr = [3, 2, 1], n = 3
输出:0
解释:数组 arr 中的 3 是峰值元素,其下标为 0。

解题思路

题目要求我们找到峰值元素,峰值元素是大于或等于其相邻元素的元素。我们可以使用二分法,从数组中间开始判断其是否当前元素是否峰值。

  • 如果当前元素满足峰值条件,直接返回当前元素下标。
  • 否则,判断数组中当前元素左侧和右侧两个元素的大小关系,如果左侧元素比当前元素大,说明峰值一定在左侧,我们继续在左侧使用二分法寻找峰值。
  • 如果右侧元素比当前元素大,说明峰值一定在右侧,我们继续在右侧使用二分法寻找峰值。

复杂度分析

这种方法是基于二分法的,时间复杂度为 O(logn)。

代码实现

public class Solution {
    public int FindPeakElement(int[] nums) {
        int left = 0, right = nums.Length - 1;
        while(left<right){
            int mid = left + (right - left) / 2;
            if(nums[mid] > nums[mid+1]){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }
}