1
/**
2
* @param {number[]} nums
3
* @return {number}
4
*/
5
var wiggleMaxLength = function (nums) {
6
//two pass
7
//assume we start with positive or start with negative
8
//choose the longest of the two
9
return Math.max(helper(nums, true), helper(nums, false));
10
};
11

12
const helper = (nums, start) => {
13
let l = 0;
14
let r = 1;
15
let res = nums.length;
16
let sign = start;
17
while (r < nums.length) {
18
//if sign are what we expected, just flip the sign
19
if ((sign && nums[r] > nums[l]) || (!sign && nums[r] < nums[l])) {
20
sign = !sign;
21
}
22
//if sign aren't what we expected then we "remove" one
23
//if we want positive then we remove the bigger number to give us a better chance of getting positive
24
//if we want negative we remove the smaller number go give us a chance of getting a negative
25
// want negative but nums[r] - nums[l] = positive => remove nums[l]
26
// want positive but nums[r] - nums[l] = negative => remove nums[l]
27
//it just so happens that the number we want to remove will always be nums[l], so we don't have to do anything special
28
else {
29
res--;
30
}
31
l++;
32
r++;
33
}
34
return res;
35
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0