栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode——摆动序列 C++

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode——摆动序列 C++

 题目描述:取自LeetCode

        第一眼看这道题,感觉有点类似于取字符串子串的题型,的确用取字符串子串的方法可以正确解出这道题,但是这道题的最后有一个进阶要求:

        这样的话就需要我们想办法用一次遍历来解决这道题。

        从题目中我们可以看出,摆动序列中元素的选取是可以有取舍的。比如【2,3,4,1】这个序列按照题目要求的话应该输出2,即【4,1】两个元素。而【2,3,4,3】这个序列同样为2,即【4,3】两个元素。那么我们可以看出,既然前面的2,3,4为升序,那就可以将它看成一个整体(即着重看序列中的趋势总数),取升序中的最大元素4与后面的元素比较即可,如果后面的元素小于4,则趋势发生变化,num+1。

        下一个问题就是如何判断第一个趋势,如果前面有很多相同元素比如序列【1,1,1,2,4,3】,则需要在中间【1,2】的地方完成第一个趋势的判断,本程序中选择使用一个bool类型变量start来完成第一个趋势判断,即当第一次出现不同元素时确定初始趋势。

        完整代码如下:

int wiggleMaxLength(vector& nums) {
        int num=1;//记录趋势变化次数
        bool isok=true,start=false;//isok代表趋势信息(true为上升,false为下降)
        if(nums.size()<2)return 1;
        int k=nums[0];
        for(int i=1;ik){
                if(isok){k=nums[i];}
                else {k=nums[i];num++;isok=true;}
            }
            else if(nums[i]nums[i]){isok=false;num++;}
                else num++;
                i--;
                }
            }
        }
        return num;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457634.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号