Wiggle Subsequence
Problem Description​
You are given an integer array nums. 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:
[1, 7, 4, 9, 2, 5]is a wiggle sequence because the differences(6, -3, 5, -7, 3)alternate between positive and negative.[1, 4, 7, 2, 5]is not a wiggle sequence because its first two differences are positive.[1, 7, 4, 5, 5]is not a wiggle sequence 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 nums, return the length of the longest wiggle subsequence of nums.
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: One possible subsequence 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 - Explanation: The longest wiggle subsequence is
[1, 2]or[9, 8].
Constraints:​
1 <= nums.length <= 10000 <= nums[i] <= 1000
Algorithm Explanation​
-
Initialization:
- Initialize two variables,
peakandvalley, to 1. These will keep track of the lengths of the longest wiggle sequences that end in a peak or a valley, respectively.
- Initialize two variables,
-
Traversal:
- Traverse through the list of numbers starting from the second element.
- If the current number is greater than the previous number, it contributes to a peak. Update
peaktovalley + 1. - If the current number is less than the previous number, it contributes to a valley. Update
valleytopeak + 1.
-
Result:
- The maximum value of
peakandvalleywill give the length of the longest wiggle subsequence.
- The maximum value of
C++ Code​
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int size = nums.size(), peak = 1, valley = 1;
for(int i = 1; i < size; ++i) {
if (nums[i] > nums[i - 1])
peak = valley + 1;
else if (nums[i] < nums[i - 1])
valley = peak + 1;
}
return max(peak, valley);
}
};
Python Code​
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
size = len(nums)
if size < 2:
return size
peak = valley = 1
for i in range(1, size):
if nums[i] > nums[i - 1]:
peak = valley + 1
elif nums[i] < nums[i - 1]:
valley = peak + 1
return max(peak, valley)
Java Code​
class Solution {
public int wiggleMaxLength(int[] nums) {
int size = nums.length;
if (size < 2) return size;
int peak = 1, valley = 1;
for (int i = 1; i < size; i++) {
if (nums[i] > nums[i - 1]) {
peak = valley + 1;
} else if (nums[i] < nums[i - 1]) {
valley = peak + 1;
}
}
return Math.max(peak, valley);
}
}
JavaScript Code​
var wiggleMaxLength = function (nums) {
let size = nums.length;
if (size < 2) return size;
let peak = 1,
valley = 1;
for (let i = 1; i < size; i++) {
if (nums[i] > nums[i - 1]) {
peak = valley + 1;
} else if (nums[i] < nums[i - 1]) {
valley = peak + 1;
}
}
return Math.max(peak, valley);
};