力扣376题(摆动序列)
376、摆动序列
基本思想:
贪心算法
具体实现:
preDiff存放上一次的差值
curDiff存放当前的差值
只要一正一负,执行count + +
但是preDiff初始化为0,不管怎样比都不会出现一正一负,
所以比较条件为
if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0))
比较preDiff时需要带等号
一个数组长度为2 ,
举例,[2,5],摆动序列的最长子序列个数应该返回2
count初始化为1
此时curDiff > 0 && preDiff <= 0,
count++ ,
最后得到的count就是2
[4,5,5,4]
返回3,
代码:
class Solution { public int wiggleMaxLength(int[] nums) { if (nums == null || nums.length <= 1) { return nums.length; } //当前差值 int curDiff = 0; //上一个差值 int preDiff = 0; int count = 1; for (int i = 1; i < nums.length; i++) { //得到当前差值 curDiff = nums[i] - nums[i - 1]; //如果当前差值和上一个差值为一正一负 //等于0的情况表示初始时的preDiff if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) { count++; preDiff = curDiff; } } return count; } }
动态规划:
class Solution { public int wiggleMaxLength(int[] nums) { // 0 i 作为波峰的最大长度 // 1 i 作为波谷的最大长度 int dp[][] = new int[nums.length][2]; dp[0][0] = dp[0][1] = 1; for (int i = 1; i < nums.length; i++){ //i 自己可以成为波峰或者波谷 dp[i][0] = dp[i][1] = 1; for (int j = 0; j < i; j++){ if (nums[j] > nums[i]){ // i 是波谷 dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1); } if (nums[j] < nums[i]){ // i 是波峰 dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1); } } } return Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]); } }