Wiggle Subsequence

medium array dp greedy

Problem

A wiggle sequence has alternating positive/negative differences between consecutive terms. Return the length of the longest wiggle subsequence of nums.

Inputnums = [1, 7, 4, 9, 2, 5]
Output6
Track up[i] = best length ending with a rise, down[i] = best length ending with a fall.

def wiggle_max_length(nums):
    if not nums:
        return 0
    up = down = 1
    for i in range(1, len(nums)):
        if nums[i] > nums[i - 1]:
            up = down + 1
        elif nums[i] < nums[i - 1]:
            down = up + 1
    return max(up, down)
function wiggleMaxLength(nums) {
  if (!nums.length) return 0;
  let up = 1, down = 1;
  for (let i = 1; i < nums.length; i++) {
    if (nums[i] > nums[i - 1]) up = down + 1;
    else if (nums[i] < nums[i - 1]) down = up + 1;
  }
  return Math.max(up, down);
}
class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length == 0) return 0;
        int up = 1, down = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > nums[i - 1]) up = down + 1;
            else if (nums[i] < nums[i - 1]) down = up + 1;
        }
        return Math.max(up, down);
    }
}
int wiggleMaxLength(vector<int>& nums) {
    if (nums.empty()) return 0;
    int up = 1, down = 1;
    for (int i = 1; i < (int)nums.size(); i++) {
        if (nums[i] > nums[i - 1]) up = down + 1;
        else if (nums[i] < nums[i - 1]) down = up + 1;
    }
    return max(up, down);
}
Time: O(n) Space: O(1)