1、题目
376. 摆动序列 - 力扣(LeetCode) https://leetcode-cn.com/problems/wiggle-subsequence/submissions/
2、题解
这题采用动态规划的方式使用一个二维数组记录当前位置元素的摆动序列长度。
dp[i][1]和dp[i][0]分别代表最长摆动序列以‘上升沿’结尾和最长摆动序列以‘下降沿’结尾。(注:上升沿是指小到大,下降沿是指大到小。)
然后进行遍历,前后两个元素对比,即可得到状态转移的条件。如下所示:
if nums[i] > nums[i-1] : dp[i][1] = dp[i-1][0] + 1 ; dp[i][0] = dp[i-1][0];
if nums[i] < nums[i-1] : dp[i][0] = dp[i-1][1] + 1 ; dp[i][1] = dp[i-1][1];
if nums[i] = nums[i-1] : dp[i][1] = dp[i-1][1] ; dp[i][0] = dp[i-1][0];
由此,遍历对比,即可得到摆动序列最长的结果
3、代码
//摆动序列
//if nums[i] > nums[i-1] : dp[i][1] = dp[i-1][0] + 1 ; dp[i][0] = dp[i-1][0];
//if nums[i] < nums[i-1] : dp[i][0] = dp[i-1][1] + 1 ; dp[i][1] = dp[i-1][1];
//if nums[i] = nums[i-1] : dp[i][1] = dp[i-1][1] ; dp[i][0] = dp[i-1][0];
class Solution {
public int wiggleMaxLength(int[] nums) {
int length = nums.length;
if(length==0){
return 0;
}
//dp;
int[][] dp = new int[length][2];//记录对应长度
int res=1;
//初始化
for(int[] d:dp){
Arrays.fill(d,0);
}
dp[0][0] = 1;
dp[0][1] = 1;
//每次的结果都进行比较
for (int i = 1; i < length; i++) {
dp[i][0] = 1;
dp[i][1] = 1;
//根据条件设置
if(nums[i]>nums[i-1]){
dp[i][1]=dp[i-1][0]+1;
dp[i][0]=dp[i-1][0];
}else if(nums[i]<nums[i-1]){
dp[i][0]=dp[i-1][1]+1;
dp[i][1]=dp[i-1][1];
}else if(nums[i]==nums[i-1]){
dp[i][1]=dp[i-1][1];
dp[i][0]=dp[i-1][0];
}
res=Math.max(dp[i][1],res);
res=Math.max(dp[i][0],res);
}
return res;
}
}