当前位置: 首页 > news >正文

LeetCode 376. 摆动序列 java题解

https://leetcode.cn/problems/wiggle-subsequence/description/

只要不满足摆动条件,就不更新count和prediff

当 prevDiff 取等号时,比如 prevDiff == 0,在这种情况下,如果 currDiff > 0,说明从持平状态转变为上升状态,这是一种有效的摆动起始情况;同理,如果 currDiff < 0,则是从持平状态转变为下降状态,也属于有效的摆动起始情况。例如序列 [1, 1, 2],第一个 1 到第二个 1 时 prevDiff = 0,第二个 1 到 2 时 currDiff > 0,这种从持平到上升的情况应该被视为摆动的开始,所以需要包含 prevDiff == 0 的情况

从摆动子序列的定义角度:摆动子序列要求序列中的元素按照一定的规律交替出现上升和下降。当序列中只有一个元素时,它可以被看作是一个特殊的摆动子序列,虽然不存在真正意义上的上升或下降交替,但它本身可以作为摆动子序列的起始点或基础,具有唯一性和确定性,符合摆动子序列的最小单元概念,所以定义其摆动数为 1。

class Solution {
    public int wiggleMaxLength(int[] nums) {
        int len=nums.length;
        if(len==1) return 1;
        if(len==2){
            return nums[0]==nums[1]?1:2;
        }
        int count=1;
        int prediff=0;
        int curdiff=0;
        for(int i=1;i<len;i++){
            curdiff=nums[i]-nums[i-1];
            if(curdiff>0){
                if(prediff<=0){
                    count++;
                    prediff=curdiff;
                }
            }
            else if(curdiff<0){
                if(prediff>=0){
                    count++;
                    prediff=curdiff;
                }
            }
            else{
                //平坡,跟上个数一样,不改变
            }
        }
        return count;
    }
}

动态规划

https://gitee.com/programmercarl/leetcode-master/blob/master/problems/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.md

// DP
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]);
    }
}

很容易可以发现,对于我们当前考虑的这个数,要么是作为山峰(即 nums[i] > nums[i-1]),要么是作为山谷(即 nums[i] < nums[i - 1])。

设 dp 状态dp[i][0],表示考虑前 i 个数,第 i 个数作为山峰的摆动子序列的最长长度 设 dp 状态dp[i][1],表示考虑前
i 个数,第 i 个数作为山谷的摆动子序列的最长长度 则转移方程为:

dp[i][0] = max(dp[i][0], dp[j][1] + 1),其中0 < j < i且nums[j] <
nums[i],表示将 nums[i]接到前面某个山谷后面,作为山峰。 dp[i][1] = max(dp[i][1], dp[j][0]

  • 1),其中0 < j < i且nums[j] > nums[i],表示将 nums[i]接到前面某个山峰后面,作为山谷。 初始状态:

相关文章:

  • 从 “12.3” 的崩溃到完美的解决方案:一场类型选择的冒险之旅
  • 蓝桥杯备赛-差分-重新排序
  • hive面试题--left join的坑
  • k8s集群中部署dcgm-exporter收集GPU指标
  • 机器学习 Day01人工智能概述
  • 串口数据记录仪DIY,体积小,全开源
  • 华为Mate 60 Pro+ 等机型适配支持运营商北斗卫星短信功能
  • 代码随想录算法训练营第六十一天 | 108. 冗余连接 109. 冗余连接II
  • 前端(AJAX)学习笔记(CLASS 4):进阶
  • 图库 | 基于图增强的智慧审计系统革新
  • Pika 技术浅析(三):生成对抗网络
  • C++编程:进阶阶段—4.2对象
  • 【十四】Golang 接口
  • 一学就会的深度学习基础指令及操作步骤(5)使用预训练模型
  • Vue3实战学习(Element-Plus常用组件的使用(输入框、下拉框、单选框多选框、el-image图片))(上)(5)
  • linux centos 安装源码nginx,开放端口
  • 【数据挖掘】知识蒸馏(Knowledge Distillation, KD)
  • 解决 Java/Kotlin 资源加载问题
  • 开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器
  • Compose 实践与探索一 —— 关键知识与概念详解
  • 坚持吃素,是不是就不会得高血脂了?
  • 跨文化戏剧的拓荒者与传承者——洪深与复旦剧社的百年回响
  • 北京航空航天大学首个海外创新研究院落户巴西
  • 学者的“好运气”:读本尼迪克特·安德森《椰壳碗外的人生》
  • 明查|印度空军“又有一架战机被巴基斯坦击落,飞行员被俘”?
  • 城事 | 重庆新增热门打卡地标,首座熊猫主题轨交站亮相