# LC 376. Wiggle Subsequence ### [Problem link](https://leetcode.com/problems/wiggle-subsequence/) ###### tags: `leedcode` `python` `c++` `medium` `Greedy` `DP` A **wiggle sequence** is a sequence where the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with one element and a sequence with two non-equal elements are trivially wiggle sequences. - For example, <code>[1, 7, 4, 9, 2, 5]</code> is a **wiggle sequence** because the differences <code>(6, -3, 5, -7, 3)</code> alternate between positive and negative. - In contrast, <code>[1, 4, 7, 2, 5]</code> and <code>[1, 7, 4, 5, 5]</code> are not wiggle sequences. The first is not because its first two differences are positive, and the second is not because its last difference is zero. A **subsequence** is obtained by deleting some elements (possibly zero) from the original sequence, leaving the remaining elements in their original order. Given an integer array <code>nums</code>, return the length of the longest **wiggle subsequence** of <code>nums</code>. **Example 1:** ``` Input: nums = [1,7,4,9,2,5] Output: 6 Explanation: The entire sequence is a wiggle sequence with differences (6, -3, 5, -7, 3). ``` **Example 2:** ``` Input: nums = [1,17,5,10,13,15,10,5,16,8] Output: 7 Explanation: There are several subsequences that achieve this length. One is [1, 17, 10, 13, 10, 16, 8] with differences (16, -7, 3, -3, 6, -8). ``` **Example 3:** ``` Input: nums = [1,2,3,4,5,6,7,8,9] Output: 2 ``` **Constraints:** - <code>1 <= nums.length <= 1000</code> - <code>0 <= nums[i] <= 1000</code> **Follow up:** Could you solve this in <code>O(n)</code> time? ## Solution 1 - Greedy #### Python ```python= class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: res = 1 preDiff = 0 curDiff = 0 for i in range(1, len(nums)): curDiff = nums[i] - nums[i - 1] if curDiff * preDiff <= 0 and curDiff != 0: res += 1 preDiff = curDiff return res ``` #### C++ ```cpp= int res = 1; int preDiff = 0; int curDiff = 0; for (int i = 1; i < nums.size(); i++) { curDiff = nums[i] - nums[i - 1]; if (curDiff * preDiff <= 0 && curDiff != 0) { res++; preDiff = curDiff; } } return res; ``` ## Solution 2 - DP #### Python ```python= class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: up = 1 down = 1 for i in range(1, len(nums)): if nums[i] > nums[i - 1]: up = down + 1 if nums[i] < nums[i - 1]: down = up + 1 return max(up, down) ``` #### C++ ```cpp= class Solution { public: int wiggleMaxLength(vector<int>& nums) { int up = 1; int down = 1; for (int i = 1; i < nums.size(); i++) { if (nums[i] > nums[i - 1]) { up = down + 1; } if (nums[i] < nums[i - 1]) { down = up + 1; } } return max(up, down); } }; ``` >### Complexity >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(n) | O(1) | >| Solution 2 | O(n) | O(1) | ## Note x