求一个序列的最大摇摆子序列的长度
方法:动态规划
思路:结尾的那个数字很重要。
注意:状态定义:以 nums[i]
结尾的摆动序列的最长子序列的长度。
dp[i][0]
表示以 nums[i]
结尾的数字是严格上升的dp[i][1]
表示以 nums[i]
结尾的数字是严格下降的
// 状态转移方程:只看结尾和前一个数的关系
// 初始化:dp[0][0] = 1,dp[0][1] = 1
// 这是比较容易想到的
// dp[i][0] = dp[i - 1][1] + 1, if nums[i] - nums[i - 1] > 0
// dp[i][1] = dp[i - 1][0] + 1, if nums[i] - nums[i - 1] < 0
// 分析到这里,知道需要分类讨论
// 输出:拉通看最大值
思路:
- 按照题目中给出的例子找出规律
- 如果我们要得出摇摆子序列的最大长度,面对小部分递增或者递减的子序列,我们应该保留它们的头和尾,中间的部分不要,这是贪心算法的应用,下面以题目中给出的例子为例:
[1,17,5,10,13,15,10,5,16,8]
[5,10,13,15] 是原序列的一个递增子序列,我们保留 5 是因为 5 在原序列中与它的前一位 17 以及之前的 1 可以构成摇摆序列,**如果我们选 10 ,那么这个 10 与在 [5,10,13,15] 之后的 10 就不能构成摇摆子序列了,因此,我们希望我们能保留的这个值越大,则保留的这个值与递增序列后面的那 1 个值构成摇摆序列的可能性就越大,这里就体现了贪心 **;
- 在具体实现的时候,我们可以根据示例画出简单的状态机,那么编码起来逻辑就很清晰了,这一点是必须要掌握的。