找出数组中的峰值
给你一个下标从 0 开始的数组 mountain
。你的任务是找出数组 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
代码
int* findPeaks(int* mountain, int mountainSize, int* returnSize) {
int* res = (int*)malloc(sizeof(int) * (mountainSize - 2));
*returnSize = 0;
for (int i = 1; i < mountainSize - 1; i++)
{
if(mountain[i] > mountain[i-1] && mountain[i] > mountain[i+1])
{
res[(*returnSize)] = i;
(*returnSize)++;
}
}
return res;
}
代码分析
-
函数参数:
int* mountain
: 指向表示山脉的数组的指针。int mountainSize
: 数组的大小。int* returnSize
: 返回结果数组的大小。
-
变量初始化:
int* res = (int*)malloc(sizeof(int) * (mountainSize - 2))
: 为存储峰值下标的结果数组分配内存。结果数组的大小不会超过mountainSize - 2
。*returnSize = 0
: 初始化返回结果数组的大小为 0。
-
遍历数组:
for (int i = 1; i < mountainSize - 1; i++)
: 从数组的第二个元素遍历到倒数第二个元素。
-
检查峰值条件:
if(mountain[i] > mountain[i-1] && mountain[i] > mountain[i+1])
: 如果当前元素严格大于其相邻元素,则将其下标存入结果数组,并增加返回结果数组的大小。
-
返回结果:
return res
: 返回存储峰值下标的结果数组。
复杂度分析
-
时间复杂度:O(n)
- 该算法仅需遍历一次数组,因此时间复杂度为 O(n),其中 n 是数组
mountain
的长度。
- 该算法仅需遍历一次数组,因此时间复杂度为 O(n),其中 n 是数组
-
空间复杂度:O(n)
- 该算法使用了一个额外的数组来存储峰值下标,因此空间复杂度为 O(n),其中 n 是数组
mountain
的长度。
- 该算法使用了一个额外的数组来存储峰值下标,因此空间复杂度为 O(n),其中 n 是数组