import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求序列a中的峰、谷点的个数
* @param a int整型一维数组 序列a
* @return int整型
*/
public int countPeakPoint (int[] a) {
if(a.length<3){
return 0;
}
int count = 0;// 计数器,每找到一个峰点或谷点就+1
// 最后三个 : a.length-3 a.length-2 a.length-1
// 使用三个指针 i, j, k 形成滑动窗口
for(int i = 0,j=1,k=2;k<a.length;k++){
// 峰点或谷点
if((a[i]<a[j] && a[j]>a[k]) || (a[i]>a[j] && a[j]<a[k])){
count++;
}
// 滑动窗口:i, j, k 各向前移动一位
i = j;
j = k;
}
return count;
}
}
算法特点
- 时间复杂度:O(n),只需遍历一次数组
- 空间复杂度:O(1),只用了几个变量
- 滑动窗口:通过 i = j; j = k; 实现窗口向前滑动
- 边界处理:自动跳过首尾元素(它们无法成为极值点)