思路:flag的正负来表示上一次的状态,当“峰”遇到下降时ans++,当“谷”遇到上升时ans++。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int n = nums.size();
if (n < 2) return n;
int flag = nums[1] - nums[0], ans = (nums[1] - nums[0]) ? 2 : 1;
for (int i = 1; i < n; ++i) {
int diff = nums[i] - nums[i - 1];
if((diff > 0 && flag <= 0) || (diff < 0 && flag >= 0)) { //
flag = diff;
ans++;
}
}
return ans;
}
};
注意(简化代码)
1:ans的初始值:如果 nums[1] - nums[0]为0时,ans为1,否则不管是“峰”还是“谷”,ans都是2
2:flag标志的问题:为什么不用-1和1来区别?因为可能有平的一段(用0来表示),比如一开始的时候,需要将0和(1 -1)分开讨论,所以会更麻烦一点,用正负的话。在判断是否出现“峰”或者“谷”的时候判断条件加上 “=”就不用把“平”单独考虑了。
思路二:相邻的去重,直接判断“峰”和“谷”
思路类似:leetcode122.买股票的最佳时机II(中等)
https://blog.csdn.net/zhangjiaji111/article/details/123921873
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
vector<int> v;
int n = nums.size(), ans = 0;
for (int i = 0; i < n; ++i) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
v.push_back(nums[i]);
}
n = v.size();
if (n == 1) return 1;
for (int i = 1; i < n - 1; ++i) {
if (v[i] > v[i - 1] && v[i] > v[i + 1]) ans++;
if (v[i] < v[i - 1] && v[i] < v[i + 1]) ans++;
}
return ans + 2;
}
};