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 <= 1001 <= 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到n-2)
- 对每个位置检查峰值条件
- 如果满足条件,将索引加入结果数组
- 返回结果数组
这种解法的时间复杂度是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) | 只使用常数级别的额外空间(不考虑结果数组) |
相关题目
. Find Peak Element (Medium)
. Find a Peak Element II (Medium)