Easy
题目描述
有 n 座山脉排成一行,每座山都有一个高度。给你一个整数数组 height,其中 height[i] 表示第 i 座山的高度,以及一个整数 threshold。
如果一座山前面的山(如果存在)的高度严格大于 threshold,则该山被称为稳定的。注意第 0 座山不稳定。
返回一个包含所有稳定山脉索引的数组,顺序任意。
示例 1:
输入:height = [1,2,3,4,5], threshold = 2
输出:[3,4]
解释:
- 第 3 座山稳定,因为 height[2] == 3 大于 threshold == 2
- 第 4 座山稳定,因为 height[3] == 4 大于 threshold == 2
示例 2:
输入:height = [10,1,10,1,10], threshold = 3
输出:[1,3]
示例 3:
输入:height = [10,1,10,1,10], threshold = 10
输出:[]
提示:
2 <= n == height.length <= 1001 <= height[i] <= 1001 <= threshold <= 100
解题思路
这是一道简单的数组遍历题目。我们需要找到所有稳定的山脉,即前一座山的高度严格大于阈值的山脉。
解题思路:
由于第 0 座山没有前一座山,所以它不可能稳定。我们只需要从索引 1 开始遍历数组,对于每个索引 i,检查 height[i-1] 是否严格大于 threshold。如果满足条件,就将索引 i 加入结果数组。
算法步骤:
- 初始化一个空的结果数组
- 从索引 1 开始遍历到数组末尾
- 对于每个索引 i,检查
height[i-1] > threshold - 如果条件成立,将索引 i 添加到结果数组中
- 返回结果数组
这是一个直接的线性扫描问题,时间复杂度为 O(n),空间复杂度为 O(1)(不考虑输出数组的空间)。
代码实现
class Solution {
public:
vector<int> stableMountains(vector<int>& height, int threshold) {
vector<int> result;
for (int i = 1; i < height.size(); i++) {
if (height[i - 1] > threshold) {
result.push_back(i);
}
}
return result;
}
};
class Solution:
def stableMountains(self, height: List[int], threshold: int) -> List[int]:
result = []
for i in range(1, len(height)):
if height[i - 1] > threshold:
result.append(i)
return result
public class Solution {
public IList<int> StableMountains(int[] height, int threshold) {
IList<int> result = new List<int>();
for (int i = 1; i < height.Length; i++) {
if (height[i - 1] > threshold) {
result.Add(i);
}
}
return result;
}
}
var stableMountains = function(height, threshold) {
const result = [];
for (let i = 1; i < height.length; i++) {
if (height[i - 1] > threshold) {
result.push(i);
}
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历数组一次,其中 n 是山脉的数量 |
| 空间复杂度 | O(1) | 只使用常量额外空间,不考虑输出数组 |
相关题目
- . Find in Mountain Array (Hard)