思路: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)分开讨论,所以会更麻烦一点,用正负的话。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)