LeetCode 2951: Find the Peaks (Array Scan)
LeetCode 2951ArraySimulationSource: https://leetcode.com/problems/find-the-peaks/
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 ansvar 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 ansvar 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