首页 > 编程语言 >「贪心算法」摆动序列

「贪心算法」摆动序列

时间:2024-05-26 20:01:21浏览次数:20  
标签:nums int 序列 算法 数组 摆动 极值 贪心

力扣原题链接,点击跳转

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。简单来说,摆动序列的特点是:后一个数交替地比前一个数大或者小。给你一个数组,请找出最长的子数组(保持元素的相对顺序),使得它是一个摆动序列,求这个子数组的长度。

这个问题可以用贪心算法解决。我们把第一个数和最后一个数,再加上所有的极值点(包括极大值点和极小值点)作为摆动序列,这个子数组一定是满足条件的最长子数组,感兴趣的读者可以试着证明这一点。这样,问题就转换为:如何求一个数组极值点的个数?

我们如何判断nums[i]是不是极值呢?一个简单的想法是,如果(nums[i]-nums[i-1])×(nums[i+1]-nums[i])<0,那么nums[i]就是极值。如果这么判断的话,会漏掉一些点。比如,一个序列是1、2、2、2、1,此时2是极大值,但是由于有连续多个相同的值,不能按照前面的方式判断。我们可以换个思路,假设我们把多余的2删掉,把序列变为1、2、1,这样就很好判断了。如何做到这一点呢?我们可以用left保存nums[i]-nums[i-1]的值,如果遇到nums[i+1]=nums[i]的情况,就跳过这个数;如果这个数没有被跳过,再判断左右两边的差是否异号。我在代码中写的是left×right≤0,是为了把第一个数考虑在内。由于还要考虑最后一个数,所以最终结果是cnt+1。

class Solution
{
public:
    int wiggleMaxLength(vector<int>& nums)
    {
        int left = 0, cnt = 0, n = nums.size();
        for (int i = 0; i < n - 1; i++)
        {
            int right = nums[i + 1] - nums[i];
            // 不考虑相同的数
            if (right == 0)
                continue;
            // 异号,是极值点
            if (left * right <= 0)
                cnt++;
            left = right;
        }

        return cnt + 1;
    }
};

标签:nums,int,序列,算法,数组,摆动,极值,贪心
From: https://blog.csdn.net/xiang_bolin/article/details/139219276

相关文章

  • 【路径规划】基于遗传算法求解带时间窗容量限制的单配送中心多骑手外卖配送路径规划问
    研究背景:随着外卖业务的快速发展,如何合理安排多骑手的配送路径,减少配送时间和成本,成为外卖平台需要解决的重要问题。在实际操作中,骑手需要在一定的时间窗内完成配送,并且配送中心的配送能力也有限,因此需要考虑时间窗和容量限制的多骑手外卖配送路径规划问题。研究步骤:理解......
  • 【机器学习-23】关联规则(Apriori)算法:介绍、应用与实现
    在现代数据分析中,经常需要从大规模数据集中挖掘有用的信息。关联规则挖掘是一种强大的技术,可以揭示数据中的隐藏关系和规律。本文将介绍如何使用Python进行关联规则挖掘,以帮助您发现数据中的有趣模式。一、引言1.简要介绍关联规则学习的概念和重要性关联规则学习是一种......
  • 数据结构中的算法-KMP算法
    一、KMP算法串的模式匹配操作是指在当前串(主串)中寻找子串(模式串)的过程。当在主串中找到了和模式串相同的子串时,模式匹配成功;否则,模式匹配失败。当模式匹配成功时,返回模式串的首字符在主串中的位置;否则,返回-1。1.1暴力模式匹配算法(Brute-Force)假设有主串S和模式串T,T的长度为......
  • 算法设计与分析 头哥educoder 批处理作业调度
     给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。所有任务必须先由机器1处理完成后,才能由机器2处理,并且在机器2的处理顺序必须与机器1的处理顺序一致,处理顺序一旦确定不能改变。设作业Ji需要机器1的处理时间为Ai,需要机器2的处理时间为Bi,怎样安......
  • 算法设计与分析 头哥educoder 旅行商问题
    设有n个城市组成的交通图,一个售货员从住地城市q出发,到其它城市各一次去推销货物,最后回到住地城市。要求:假定两个城市a,b从a到b的路程花费w_ab是已知的,问应该怎样选择一条花费最少的路线?输入格式:第一行nmq,n和m两个整数分别表示城市数n以及城市之间的单向路数量m,q表示住地城......
  • 风控图算法Graph Embedding(DeepWalk&Node2Vec)代码实现
    风控图算法GraphEmbedding(DeepWalk&Node2Vec)代码实现在上一篇中我们简单介绍了常用的GraphEmbedding算法,今天来对其中较为常用的两种算法——DeepWalk和Node2Vec进行python代码实现。文章目录风控图算法GraphEmbedding(DeepWalk&Node2Vec)代码实现一、KarateClub算......
  • 银行家算法—安全状态
    银行家算法中设置4个数据结构:Max:进程对资源的最大需求数Allocation:已分配给该进程的资源数Need:目前该进程还需要的资源数(在已分配部分资源情况下)******    且   Need=Max-Allocation  ******Available:系统中可用资源的数目......
  • 代码随想录算法训练营第第18天 | 513.找树左下角的值 、112. 路径总和 、106.从中
    找树左下角的值本地递归偏难,反而迭代简单属于模板题,两种方法掌握一下题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.找树左下角的值.html/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*this.val=(val===undef......
  • 超简单白话文机器学习 - 回归树&树剪枝(含算法介绍,公式,源代码实现以及调包实现)
    1.回归树1.1算法介绍大家看到这篇文章时想必已经对树这个概念已经有基础了,如果不是很了解的朋友可以看看笔者的这篇文章:超简单白话文机器学习-决策树算法全解(含算法介绍,公式,源代码实现以及调包实现)_白话决策树-CSDN博客对于回归树的建立,我们一般使用CART回归树,CART(Clas......
  • 自用:常见算法竞赛/刷题问题 & 模板
    以下是我平常刷题遇到的部分常见问题,随手记录一下。(不定时更新)基本算法二维前缀和for(inti=1;i<=m;++i){ for(intj=1;j<=n;++j) { pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+nums[i][j]; }}//异或版本for(inti=1;i......