Easy

题目描述

给你一个下标从 0 开始的数组 mountain。你的任务是找到山脉数组中所有的峰值。

返回一个由给定数组中峰值的下标组成的数组,顺序不限

注意:

  • 峰值是指严格大于其相邻元素的元素。
  • 数组的第一个和最后一个元素不是峰值。

示例 1:

输入:mountain = [2,4,4]
输出:[]
解释:mountain[0] 和 mountain[2] 不能是峰值,因为它们是数组的第一个和最后一个元素。
mountain[1] 也不能是峰值,因为它不严格大于 mountain[2]。
所以答案是 []。

示例 2:

输入:mountain = [1,4,3,8,5]
输出:[1,3]
解释:mountain[0] 和 mountain[4] 不能是峰值,因为它们是数组的第一个和最后一个元素。
mountain[2] 也不能是峰值,因为它不严格大于 mountain[3] 和 mountain[1]。
但是 mountain[1] 和 mountain[3] 严格大于它们的相邻元素。
所以答案是 [1,3]。

提示:

  • 3 <= mountain.length <= 100
  • 1 <= mountain[i] <= 100

提示:

  • 如果 nums[i] > nums[i-1]nums[i] > nums[i+1],则 nums[i] 是一个峰值。

解题思路

这是一道简单的数组遍历问题。我们需要找到数组中所有的峰值位置。

解题思路:

根据题目定义,峰值是严格大于其相邻元素的元素,且第一个和最后一个元素不能是峰值。因此我们只需要检查索引范围 [1, n-2] 的元素。

对于索引为 i 的元素,它是峰值的条件是:

  • mountain[i] > mountain[i-1](严格大于左邻居)
  • mountain[i] > mountain[i+1](严格大于右邻居)

算法步骤:

  1. 初始化结果数组
  2. 遍历数组的中间部分(索引从1到n-2)
  3. 对每个位置检查峰值条件
  4. 如果满足条件,将索引加入结果数组
  5. 返回结果数组

这种解法的时间复杂度是O(n),空间复杂度是O(1)(不考虑结果数组),是最优解法。

由于数组长度限制在100以内,这种直接遍历的方法既简单又高效。

代码实现

class Solution {
public:
    vector<int> findPeaks(vector<int>& mountain) {
        vector<int> result;
        int n = mountain.size();
        
        for (int i = 1; i < n - 1; i++) {
            if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i + 1]) {
                result.push_back(i);
            }
        }
        
        return result;
    }
};
class Solution:
    def findPeaks(self, mountain: List[int]) -> List[int]:
        result = []
        n = len(mountain)
        
        for i in range(1, n - 1):
            if mountain[i] > mountain[i - 1] and mountain[i] > mountain[i + 1]:
                result.append(i)
        
        return result
public class Solution {
    public IList<int> FindPeaks(int[] mountain) {
        List<int> result = new List<int>();
        int n = mountain.Length;
        
        for (int i = 1; i < n - 1; i++) {
            if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i + 1]) {
                result.Add(i);
            }
        }
        
        return result;
    }
}
var findPeaks = function(mountain) {
    const result = [];
    const n = mountain.length;
    
    for (let i = 1; i < n - 1; i++) {
        if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i + 1]) {
            result.push(i);
        }
    }
    
    return result;
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(n)需要遍历数组一次,其中 n 是数组长度
空间复杂度O(1)只使用常数级别的额外空间(不考虑结果数组)

相关题目