【力扣每日一题】力扣2765最长交替子数组

这篇具有很好参考价值的文章主要介绍了【力扣每日一题】力扣2765最长交替子数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目来源

力扣2765最长交替子数组

题目概述

给你一个下标从 0 开始的整数数组 nums 。如果 nums 中长度为 m 的子数组 s 满足以下条件,我们称它是一个 交替子数组 :

m 大于 1 。 s1 = s0 + 1 。 下标从 0 开始的子数组 s 与数组 [s0s1s0s1,...,s(m-1) % 2] 一样。也就是说,s1 - s0 = 1 ,s2 - s1 = -1 ,s3 - s2 = 1 ,s4 - s3 = -1 ,以此类推,直到 **s[m - 1] - s[m - 2] = (-1)m **。 请你返回 nums 中所有 交替 子数组中,最长的长度,如果不存在交替子数组,请你返回 -1 。

子数组是一个数组中一段连续 非空 的元素序列。

解题思路

思路一:记录交替数组首字符,当遇到可能是交替元素时将较小元素与首元素比较。 思路二: 记录上次两元素之差,遇到可能是交替元素时比较两次的差是不是相反数。

代码实现

java实现

java实现使用思路二

public class Solution {
    public int alternatingSubarray(int[] nums) {
        int lastSub = nums[1] - nums[0];
        int count = lastSub == 1 ? 2 : 0;
        int max = 0;
        for (int i = 2; i < nums.length; i++) {
            int currentSub = nums[i] - nums[i - 1];
            // 如果两元素差为1
            if (currentSub == 1 || currentSub == -1) {
                // 当为相反数时加入数组
                if (lastSub == -currentSub && count > 0) {
                    count++;
                // 数组起始
                }else if (currentSub == 1) {
                    max = Math.max(max, count);
                    count = 2;
                // 数组结束
                }else {
                    max = Math.max(max, count);
                    count = 0;
                }
            // 数组结束
            }else {
                max = Math.max(max, count);
                count = 0;
            }
            lastSub = currentSub;
        }
        max = Math.max(max, count);
        return max == 0 ? -1 : max;
    }
}

c++实现

c++使用思路一实现文章来源地址https://www.toymoban.com/news/detail-820678.html

class Solution {
public:
    int alternatingSubarray(vector<int>& nums) {
        int count = 0;
        int max = 0;
        int start = 0;
        for (int i = 1; i < nums.size(); i++) {
            // 如果前一个比后一个大
            if (nums[i] == nums[i - 1] - 1) {
                // 如果符合
                if (start == nums[i]) {
                    count++;
                }
                else if (count != 0) {
                    max = max > count ? max : count;
                    count = 0;
                    start = 0;
                }
                // 前一个比后一个小
            }
            else if (nums[i] == nums[i - 1] + 1) {
                // 还没有交替数组,开始计算交替数组
                if (start == 0) {
                    start = nums[i - 1];
                    count = 2;
                    // 已经有交替数组了,如果找到的数据符合交替数组,增加长度
                }
                else if (start == nums[i - 1]) {
                    count++;
                    // 已经开始计算交替数组了,并且找到的数据不符合,开启了一个新的数组
                }
                else {
                    max = max > count ? max : count;
                    start = nums[i - 1];
                    count = 2;
                }

            }
            else if (count != 0) {
                max = max > count ? max : count;
                count = 0;
                start = 0;
            }
        }
        max = max > count ? max : count;
        return max == 0 ? -1 : max;
    }
};

到了这里,关于【力扣每日一题】力扣2765最长交替子数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ( 动态规划) 674. 最长连续递增序列 / 718. 最长重复子数组——【Leetcode每日一题】

    难度:简单 给定一个未经排序的整数数组,找到最长且 连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l r) 确定,如果对于每个 l = i r ,都有 nums[i] nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

    2024年02月05日
    浏览(52)
  • LeetCode·每日一题·2544. 交替数字和·模拟

    作者:小迅 链接:https://leetcode.cn/problems/alternating-digit-sum/solutions/2341276/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-7fjq/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。     题意 - 给定一个数字,将数字按位分解,按最高位取 +,之后

    2024年02月15日
    浏览(47)
  • ( 动态规划) 516. 最长回文子序列 ——【Leetcode每日一题】

    难度:中等 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入:s = “bbbab” 输出:4 解释:一个可能的最长回文子序列为 “bbbb” 。 示例

    2024年02月06日
    浏览(43)
  • 【五一创作】( 字符串) 409. 最长回文串 ——【Leetcode每日一题】

    难度:简单 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 \\\"Aa\\\" 不能当做一个回文字符串。 示例 1: 输入:s = “abccccdd” 输出:7 解释: 我们可以构造的最长的回文串是\\\"dccaccd\\\", 它的长度是

    2024年02月01日
    浏览(56)
  • 力扣每日一题88:合并两个有序数组

    给你两个按  非递减顺序  排列的整数数组  nums1   和  nums2 ,另有两个整数  m  和  n  ,分别表示  nums1  和  nums2  中的元素数目。 请你  合并   nums2   到  nums1  中,使合并后的数组同样按  非递减顺序  排列。 注意: 最终,合并后数组不应由函数返回,而是存储在

    2024年02月07日
    浏览(46)
  • 【力扣每日一题04】数组篇--搜索插入位置

    今天的题目,利用的是二分查找原理。很不幸我又没做出来,但是也很高兴发现自己的不足~ 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 示例 1: 示例 2: 示例 3: 由于官方答案我看不明

    2024年02月09日
    浏览(42)
  • 每日一题:LeetCode-LCR 016. 无重复字符的最长子串

    前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈    🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉 算法 👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长

    2024年02月03日
    浏览(43)
  • 【力扣每日一题】2023.8.13 合并两个有序数组

    目录 题目: 示例: 分析: 代码: 题目给我们两个升序数组,让我们合并它们,要求合并之后仍然是升序,并且这个合并操作是在数组1原地修改的。数组1的有效数据长度为 m ,而数组1的长度为 m + n,n 是数组2的有效数据长度以及数组的长度。 比较直观容易想到的做法就是

    2024年02月12日
    浏览(40)
  • 【力扣每日一题】88. 合并两个有序数组 &双指针 & 辅助数组 & 8.13打卡

    88. 合并两个有序数组 难度: 简单 描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而

    2024年02月09日
    浏览(41)
  • (数组) 941. 有效的山脉数组 ——【Leetcode每日一题】

    难度:简单 给定一个整数数组 arr ,如果它是有效的山脉数组就返回 true ,否则返回 false 。 让我们回顾一下,如果 arr 满足下述条件,那么它是一个山脉数组: arr.length = 3 在 0 i arr.length - 1 条件下,存在 i 使得: arr[0] arr[1] ... arr[i-1] arr[i] arr[i] arr[i+1] ... arr[arr.length - 1] 示例

    2024年02月09日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包