首页 > 其他分享 >LeetCode 376. 摆动序列

LeetCode 376. 摆动序列

时间:2023-10-16 22:02:54浏览次数:41  
标签:nums 我们 序列 差值 摆动 正数 LeetCode 376

最长递增子序列

题目链接:

376. 摆动序列

题目描述:

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 **摆动序列 。**第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

  • 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。
  • 相反,[1, 4, 7, 2, 5][1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。

给你一个整数数组 nums ,返回 nums 中作为 摆动序列最长子序列的长度

题目解析

这道题目理解还是有一点困难的.我们先说一下摆动序列的定义, 下面每一个数字可以理解为两个数的差.

image-20231016211531917

如果我们数组的一个元素减去前面的一个元素构成上面这种一正一负的情况,我们把这个数组称之为摆动序列.

image-20231016211828297

算法原理

我们还是按照我们的一般的经验来解决这个问题

  • 以...为结尾

状态表示

这里我们定义下面的状态

dp[i] : 表示以i位置为结尾的我们的摆动序列的最大的长度

当时我们依照上面的来实现状态转移方程的时候,此时出现两个状态

  • 差值为 正数
  • 差值 为 负数

所以这里是多状态的.

f[i]: 表示以i位置为结尾, 我们差值为正值的摆动序列的最大长度
g[i]: 表示以i位置为结尾, 我们差值为负值的摆动序列的最大长度

状态转移方程

在进行状态转移方程的计算的时候,我们首先要计算我们的差值

1.如果差值是正数
    1.1 更新 f[i] = g[i-1] + 1 ,这是因为需要和前面的差值是负数打配合
    1.2 更新 g[i] = g[i-1]     ,g[i] 不需要变换
2.如果差值是负数
    2.1 更新 g[i] = f[i-1] + 1 , 和正数打配合
    2.2 更新 f[i] = f[i-1]
3.如果差值是0
    3.1 更新 g[i] = g[i-1]
    3.2 更新 f[i] = f[i-1]

初始化

这里我们看到题目有一个很重要的说法,他说如果单独一个元素,那么我们也是摆动序列.也就是

f[0] = 1
g[0] = 1

填表顺序

从左向右填,两个表一起走.

返回值

返回我们的两个数组最后的较大值就可以了.注意,有的时候我们返回值拿一个变量保存最大值,有的时候返回我们的最后一个元素,这里我们不做记忆,可以看我们的例子来具体的使用那个.

编写代码

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        
        int n = nums.size();
        vector<int> f(n, 1);
        vector<int> g(n, 1);
        for(int i = 1; i < nums.size(); ++i)
        {
            int ret = nums[i] - nums[i-1];
            if(ret > 0)
            {
                f[i] = g[i-1]+1;
                g[i] = g[i-1];
            }   
            else if(ret < 0)
            {
                g[i] = f[i-1]+1;
                f[i] = f[i-1];
            }   
            else 
            {
                f[i] = f[i-1];
                g[i] = g[i-1];
            }  
        }
        return max(f.back(), g.back());
    }
};

image-20231016213511637

标签:nums,我们,序列,差值,摆动,正数,LeetCode,376
From: https://blog.51cto.com/byte/7894065

相关文章

  • Leetcode203.移除链表元素
    题目描述给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例提交的代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • [Leetcode Weekly Contest]367
    链接:LeetCode[Leetcode]2903.找出满足差值条件的下标I给你一个下标从0开始、长度为n的整数数组nums,以及整数indexDifference和整数valueDifference。你的任务是从范围[0,n-1]内找出2个满足下述所有条件的下标i和j:abs(i-j)>=indexDifference且a......
  • 周赛363 Leetcode 2861. 最大合金数
    题解k个小问题,对每台机器分别计算这台机器最多能制造出多少合金,然后所有机器取max,就是最大合金数。参数太多不好直接算如果暴力,枚举制造1份合金,2份合金,...,但是budget和stock都是1e8,会超时但是暴力可以给我们一个启发:制造的合金数越多,花的钱越多。我们是否可以猜一个答案?如果......
  • LeetCode54. 螺旋矩阵Ⅰ
    题目描述给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例提交的代码classSolution{publicList<Integer>spiralOrder(int[][]matrix){//行数intm=matrix.length;//列数intn=matrix[0].......
  • #yyds干货盘点# LeetCode程序员面试金典:H 指数
    题目:给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h指数的定义:h 代表“高引用次数”,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次......
  • #yyds干货盘点# LeetCode程序员面试金典:四数相加 II
    1.简述:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i,j,k,l) 能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0 示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,2]输出:2......
  • LeetCode59. 螺旋矩阵Ⅱ
    题目描述给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例提交的代码classSolution{intmatrixLen=0;publicint[][]generateMatrix(intn){ //初始化空数组int[][]matrix=newint[n][......
  • leetcode2845. 统计趣味子数组的数目
    题解classSolution{public:longlongcountInterestingSubarrays(vector<int>&nums,intmodulo,intk){inta[100010];unordered_map<int,int>mp;mp[0]=1;longlongans=0;intpre=0;......
  • LeetCode Day04 24&19&02.07&142
    24. 两两交换链表中的节点这题使用虚拟头结点会更好做,因为有虚拟头结点我们交换结点的时候步骤会更加清晰。操作此类有指针类型的题目要注意:1.画图避免混乱2.注意指针先后顺序classSolution{publicListNodeswapPairs(ListNodehead){ListNodedumyhea......
  • LeetCode209. 长度最小的子数组
    题目描述给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例输入:target=7,nums=[2,3,1,2,4,3]输出:2......