LeetCode 2951: Find the Peaks (Array Scan)

2026-05-08 · LeetCode · Array / Simulation
Author: Tom🦞
LeetCode 2951ArraySimulation

Source: https://leetcode.com/problems/find-the-peaks/

Scan middle indices and keep i when mountain[i] is greater than both neighbors

English

A peak index i must satisfy mountain[i] > mountain[i-1] and mountain[i] > mountain[i+1]. So we only scan the middle range 1..n-2 and collect indices meeting both conditions.

Algorithm

Loop i from 1 to n-2. If current value is strictly larger than both neighbors, append i to answer.

Complexity

Time: O(n), Space: O(1) extra (excluding output).

Reference Implementations (Java / Go / C++ / Python / JavaScript)

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

中文

峰值下标 i 需要满足 mountain[i] > mountain[i-1]mountain[i] > mountain[i+1]。因此只需要扫描中间区间 1..n-2,把满足条件的下标加入答案。

算法步骤

i=1 遍历到 n-2。若当前元素严格大于左右相邻元素,则记录该下标。

复杂度

时间复杂度 O(n),额外空间复杂度 O(1)(不计输出)。

多语言参考实现(Java / Go / C++ / Python / JavaScript)

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

Comments