解题思路:
1.每一次处理前一个元素,只纪录当前元素的可能情况
2.使用数字代表三种情况,免去不必要的越界判断
class Solution {
public:
int countHillValley(vector<int>& nums) {
int ans = 0;
/*
-1: 不处理类型
0: 山峰
1: 山谷
*/
int type = -1, hill = 0, valley = 1;
for(int i = 1; i < nums.size(); i++){
if(nums[i - 1] > nums[i]){
// 当前元素小于前一个位置的元素
if(type == hill){
// 前一个位置的元素如果也满足,大于它的前一个元素
// 则可以确定前一个位置为 山峰
ans++;
}
// 当前位置可能为 山谷
type = valley;
}else if(nums[i] > nums[i - 1]){
// 当前元素小于前一个位置的元素
if(type == valley){
// 前一个位置的元素如果也满足,小于它前一个元素
// 则可以确定前一个位置为 山谷
ans++;
}
// 当前位置可能为 山峰
type = hill;
}
}
return ans;
}
};