LeetCode每日1题--376.摆动序列

78 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/wi…

image.png

解析

这里我们选用贪心算法解决,就是每次都选择局部最优解就可以得到摆动序列的最长子序列的长度,这就是贪心算法。

如何选择局部最优解?

思路很明确,如下,我们通过差值计算当前节点差值和上一个节点的差值

image.png

只要curDiff > 0 && preDiff <= 0或者curDiff < 0 && preDiff >= 0也就是满足了我们图中所表达的意思的,我们就让count加1,最后返回count的值就是摆动序列的最长子序列的长度!

是不是非常的amazing呢?

完整代码

每行代码都有详细的注释,贪心算法其实就是想局部最优解,然后想办法实现,没有什么套路,就是需要多写多练!不要想着短时间内轻松的掌握它们!

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (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;
    }
}