首页 > 其他分享 >代码随想录刷题学习日记

代码随想录刷题学习日记

时间:2024-11-23 14:32:09浏览次数:12  
标签:pre cur nums int 随想录 result 序列 日记 刷题

仅为个人记录复盘学习历程,解题思路来自代码随想录

代码随想录刷题笔记总结网址:
代码随想录

376. 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

输入数据:整型数组nums。

关键思路:

使用贪心法解决该问题。

局部最优,删除单调坡度上的中间节点(非两端节点),这个坡度就可以有两个局部峰值。

全局最优,拥有最多的局部峰值。

实际操作不需要真的删除节点,只需要将中间节点忽略,不统计在内即可。

通过遍历数组,计算nums[i]-nums[i-1]和nums[i+1]-nums[i]的大小来判断是否需要将该结点统计在内。如果(nums[i]-nums[i-1])>0&&(nums[i+1]-nums[i]<0)或(nums[i]-nums[i-1]<0)&&(nums[i+1]-nums[i]>0)需要统计,这里排除了等于0的情况,等于0的情况在这基础上讨论。

等于0的情况分三种:

用来统计的result默认为1,用来默认数组最右边有一个局部峰值。假设pre=nums[i]-nums[i-1],cur=nums[i+1]-nums[i]。

上下坡中有平坡。

    2-2-2-2                                                                                                                                               /           \                                                                                                                                             1             1

假设删除左边三个2,那么需要统计1,最右边的2(最右边的1由统计的result初始化表示)。

对于最左边的1,pre=0(初始化为0),cur=1>0,需要记录在内,所以当(nums[i]-nums[i-1]<=0)&&(nums[i+1]-nums[i]>0)需要在我们判断是否记录的条件内,而对于最右边的2,pre=2-2=0,cur=1-2=-1<0,同样需要记录在内,所以(nums[i]-nums[i-1])>=0&&(nums[i+1]-nums[i]<0)同样需要在我们判断是否记录的条件内。所以判断是否记录的条件扩展为:nums[i]-nums[i-1]<=0)&&(nums[i+1]-nums[i]>0)||nums[i]-nums[i-1])>=0&&(nums[i+1]-nums[i]<0)。

数组首尾两端。

2                                                                                                                                                            \                                                                                                                                                           5

根据我们的判断条件:对于2,pre=0,cur=3,记录在内,再加上result初始化为1,结果为2,符合我们的需求。

单调坡中有平坡。

5                                                                                                                                                            \                                                                                                                                                           2-2-2-2                                                                                                                                                           \                                                                                                                                                             1

按照我们的判断条件,对于这样,在5统计了一次,在最右边的2统计了一次,由于result初始化为1,所以统计出来为3,实际上应该为2,这是由于pre的更新被平缓的2影响,只需要在统计的时候再更新pre=cur,就可以避免平缓的2对pre的更新造成影响。

代码大致如下:

    public int wiggleMaxLength(int[] nums) {

        int result=1;
        int cur=0;
        int pre=0;

        for(int i=0;i<nums.length-1;i++){
            cur=nums[i+1]-nums[i];
            if((pre>=0&&cur<0)||(pre<=0&&cur>0)){
                result++;
                pre=cur;
            }
        }
        return result;
        
    }

标签:pre,cur,nums,int,随想录,result,序列,日记,刷题
From: https://blog.csdn.net/weixin_73939095/article/details/143991054

相关文章

  • 代码随想录算法训练营第十三天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子
    110.平衡二叉树题目链接:.-力扣(LeetCode)文章链接:代码随想录视频链接:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com,这里刷题顺序,详......
  • 【代码随想录Day50】图论Part02
    岛屿数量深搜题目链接/文章讲解:代码随想录classSolution{//计算网格中岛屿的数量publicintnumIslands(char[][]grid){intsum=0;//初始化岛屿数量为0//遍历整个网格for(inti=0;i<grid.length;i++){......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录二叉树理论基础学习二叉树有两种主要的形式:满二叉树和完全二叉树。满二叉树:只有度为0的结点和度为2的结点,且度为0的结点在同一层的二叉树。深度为k,有2^k-1个节点。完全二叉树:除了最......
  • 考公刷题,如何才能做到有效提高?
    在这个“不拼爹”的时代里,考公务员成了不少小伙伴们的首选。但是,要想在这条路上走得稳当,可不是一件容易的事儿。如何通过刷题来提升自己的竞争力呢?我们就来说说那些能让你刷题效率翻倍的小技巧吧!1.制定合理的学习计划刷题不是漫无目的地做题,而是要有计划地进行。想象一下,如......
  • 代码随想录打卡Day3
    链表:通过指针链接的线性数据结构。链表由两部分组成,一为数据域,一为指针域。并与结构体有很大关系,链表的节点一般都是结构体,其中包含了该节点的数据部分以及指向下一节点的指针。通过这种方式,链表将结构体与指针连接起来,从而构建一个强大的数据结构,可以同时实现数据的组织和动......
  • P4343 [SHOI2015] 自动刷题机(最详细版本 通俗易懂)
    题目背景曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机——一种可以自动AC题目的神秘装置。题目描述自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序。每秒,自动刷题机的代码生成模块会有两种可能的结果:1.写了 x 行代码2......
  • 打卡信奥刷题(069)用C++工具信奥P11076[普及组/提高] 「FSLOI Round I」单挑
    「FSLOIRoundI」单挑题目背景Englishstatement.YoumustsubmityourcodeattheChineseversionofthestatement.小F和小S经常进行篮球单挑,但小S总是被盖帽。题目描述每次单挑的结果一定是小F获胜或者小S获胜,不存在平局的情况。由于小F和小S实......
  • 【刷题】东方博宜OJ 1136 - 输出m和n范围内的完全数(完美数)
    1136-输出m和n范围内的完全数(完美数)东方博宜OJ输入210输出6题解这题时间范围要注意,因数自定义函数不够优化会超时。#include<bits/stdc++.h>#definelonglongll;#defineunsignedlonglongull;usingnamespacestd;intf(intn){ intans=1; ......
  • 力扣刷题_SQL50题
    高频SQL50题(基础版)-学习计划-力扣(LeetCode)全球极客挚爱的技术成长平台602.好友申请II:谁有最多的好友题目:编写解决方案,找出拥有最多的好友的人和他拥有的好友数目。生成的测试用例保证拥有最多好友数目的只有1个人。CreatetableIfNotExistsRequestAccepte......
  • 代码随想录|二叉树part 03
    求普通二叉树的节点数量要点:将子节点的个数记录到父节点,使用后序遍历classSolution{public:intmaxDepth(TreeNode*root){if(root==NULL)return0;intleft1=maxDepth(root->left);intright1=maxDepth(root->right);intnum=......