LeetCode 2765. 最长交替子数组解析与解题思路

news/2025/1/12 6:19:23/

LeetCode 2765. 最长交替子数组解析与解题思路

在本篇博客中,我们将深入解析 LeetCode 上的一道有趣题目 —— 2765. 最长交替子数组。我们将通过题目理解、解题思路、代码实现以及示例解析,全面掌握这道题目的解决方法。

题目描述

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

  1. m 大于 1。
  2. s1 = s0 + 1
  3. 子数组 s 与数组 [s0, s1, s0, s1, ..., s(m-1) % 2] 一样。也就是说,s1 - s0 = 1s2 - s1 = -1s3 - s2 = 1s4 - s3 = -1,以此类推,直到 s[m - 1] - s[m - 2] = (-1)^(m-1)

请你返回 nums 中所有交替子数组中,最长的长度。如果不存在交替子数组,请返回 -1

注意

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

示例

示例 1

输入:nums = [2,3,4,3,4]
输出:4
解释:交替子数组有 [2,3],[3,4],[3,4,3] 和 [3,4,3,4]。最长的子数组为 [3,4,3,4],长度为 4。

示例 2

输入:nums = [4,5,6]
输出:2
解释:[4,5] 和 [5,6] 是仅有的两个交替子数组。它们长度都为 2。

提示

  • 2 <= nums.length <= 100
  • 1 <= nums[i] <= 10^4

解题思路

为了找到数组中最长的交替子数组,我们需要按照题目定义的条件进行检查。具体来说:

  1. 子数组长度大于1:我们只需要考虑长度至少为2的子数组。
  2. 相邻元素关系:第一个元素与第二个元素之间的差必须为1,即 s1 = s0 + 1
  3. 交替关系:之后的元素需要交替地增减,即 s2 = s1 - 1s3 = s2 + 1,以此类推。

基于上述条件,我们可以采用滑动窗口的方法,遍历数组,找到满足条件的最长子数组。

具体步骤

  1. 初始化答案 ans-1,表示尚未找到满足条件的子数组。
  2. 使用指针 i 遍历数组,从第一个元素开始。
  3. 对于每一个位置 i,检查 nums[i+1] - nums[i] 是否等于1。如果不等于1,则继续移动指针。
  4. 如果满足 nums[i+1] - nums[i] == 1,则记录当前起始位置 i0
  5. 然后,开始检查后续元素是否符合交替关系:
    • 第三个元素 nums[i+2] 应该等于 nums[i](即 nums[i+2] == nums[i])。
    • 第四个元素 nums[i+3] 应该等于 nums[i+1],以此类推。
  6. 持续扩展子数组长度,直到不满足交替关系。
  7. 更新 ans 为当前找到的子数组长度与之前记录的最大值之间的较大者。
  8. 重复上述过程,直到遍历完整个数组。
  9. 最后返回 ans

代码实现

以下是基于上述思路的 Python 代码实现:

class Solution:def alternatingSubarray(self, nums: List[int]) -> int:ans = -1i, n = 0, len(nums)while i < n - 1:# 检查当前和下一个元素是否满足差为1if nums[i + 1] - nums[i] != 1:i += 1continue# 记录当前起始位置i0 = ii += 2# 检查后续元素是否满足交替关系while i < n and nums[i - 2] == nums[i]:i += 1# 更新答案ans = max(ans, i - i0)# 回退一位,以防漏掉可能的子数组i -= 1return ans

代码解析

  1. 初始化

    • ans = -1:用于记录最长的交替子数组长度,初始设为 -1 表示尚未找到。
    • i, n = 0, len(nums)i 为当前遍历的索引,n 为数组长度。
  2. 主循环

    • while i < n - 1:遍历数组,确保至少有两个元素可以比较。
    • if nums[i + 1] - nums[i] != 1:检查当前元素与下一个元素的差是否为1,不满足则移动指针 i
  3. 找到可能的交替子数组起点

    • i0 = i:记录子数组的起始位置。
    • i += 2:跳过下一个元素,准备检查更长的子数组。
  4. 检查交替关系

    • while i < n and nums[i - 2] == nums[i]:检查当前元素是否等于起始位置的元素,以维持交替关系。
    • i += 1:如果满足条件,继续扩展子数组长度。
  5. 更新答案

    • ans = max(ans, i - i0):更新最长子数组长度。
    • i -= 1:回退一位,防止遗漏潜在的子数组。
  6. 返回结果

    • return ans:返回找到的最长交替子数组长度,如果没有则返回 -1

示例解析

让我们通过示例来更好地理解算法的执行过程。

示例 1

输入:nums = [2,3,4,3,4]

步骤

  1. i = 0

    • nums[1] - nums[0] = 3 - 2 = 1,满足条件。
    • i0 = 0i = 2
    • 检查 nums[0] == nums[2]2 == 4,不满足,停止扩展。
    • 更新 ans = max(-1, 2 - 0) = 2
  2. i = 1

    • nums[2] - nums[1] = 4 - 3 = 1,满足条件。
    • i0 = 1i = 3
    • 检查 nums[1] == nums[3]3 == 3,满足,i = 4
    • 检查 nums[2] == nums[4]4 == 4,满足,i = 5(超出范围)。
    • 更新 ans = max(2, 5 - 1) = 4
  3. 遍历结束,返回 ans = 4

结果:4

示例 2

输入:nums = [4,5,6]

步骤

  1. i = 0

    • nums[1] - nums[0] = 5 - 4 = 1,满足条件。
    • i0 = 0i = 2
    • 检查 nums[0] == nums[2]4 == 6,不满足,停止扩展。
    • 更新 ans = max(-1, 2 - 0) = 2
  2. i = 1

    • nums[2] - nums[1] = 6 - 5 = 1,满足条件。
    • i0 = 1i = 3(超出范围)。
    • 更新 ans = max(2, 3 - 1) = 2
  3. 遍历结束,返回 ans = 2

结果:2


http://www.ppmy.cn/news/1562423.html

相关文章

网站运营数据pv、uv、ip

想要彻底弄清楚pv uv ip的区别&#xff0c;首先要知道三者的定义&#xff1a; IP(独立IP)的定义&#xff1a; 即Internet Protocol,指独立IP数。24小时内相同公网IP地址只被计算一次。 PV(访问量)的定义&#xff1a; 即Page View,即页面浏览量或点击量&#xff0c;用户每次刷…

MySQL 如何实现可重复读?

文章目录 MySQL 可重复读的实现原理1. 多版本并发控制&#xff08;MVCC&#xff09;2. 隐藏列3. 读视图&#xff08;ReadView&#xff09;4. 版本链 案例说明案例 1&#xff1a;避免不可重复读案例 2&#xff1a;避免幻读 说明 MySQL 可重复读的实现原理 1. 多版本并发控制&am…

【PPTist】查找替换、绘制文本框

一、查找、替换 查找替换的组件 src/views/Editor/SearchPanel.vue 回车的时候会执行查找&#xff0c;查找替换功能的相关方法和属性都在 src/hooks/useSearch.ts 中。 1、查找 查找的方法也比较的朴实无华&#xff0c;就是 for 循环所有的幻灯片中的所有元素&#xff0c;通…

【20250109】Nature子刊:一种可改善帕金森患者冻结步态的柔性可穿戴机器人系统...

引言&#xff1a;冻结步态&#xff08;FoG&#xff09;是帕金森病中一种极具破坏性的步态障碍&#xff0c;会导致患者在行走时意外停顿。目前针对冻结步态的治疗效果有限且短暂&#xff0c;因此缺乏有效的治疗方法。该论文展示了一种使用机器人改善帕金森冻结步态的概念验证&am…

自然语言处理之jieba分词和TF-IDF分析

jieba分词和TF-IDF分析 目录 jieba分词和TF-IDF分析1 jieba1.1 简介1.2 终端下载1.3 基本语法 2 TF-IDF分析2.1 什么是语料库2.2 TF2.3 IDF2.4 TF-IDF2.5 函数导入2.6 方法 3 实际测试3.1 问题解析3.2 代码测试 1 jieba 1.1 简介 结巴分词&#xff08;Jieba&#xff09;是一个…

Web后端开发总结(day14)

Web后端开发总结 web后端开发现在基本上都是基于标准的三层架构进行开发的&#xff0c;在三层架构当中&#xff0c;Controller控制器 层负责接收请求响应数据&#xff0c;Service业务层负责具体的业务逻辑处理&#xff0c;Dao数据访问层也叫持久层&#xff0c; 就是用来处理数据…

MyBatis深入了解

目录 xml 映射文件中&#xff0c;除了常见的select、insert、update、delete 标签之外&#xff0c;还有哪些标签? Dao 接口的工作原理是什么?Dao 接口里的方法&#xff0c;参数不同时&#xff0c;方法能重载吗? MyBatis 是如何进行分页的?分页插件的原理是什么? 简述 …

sql正则表达

MySQL中的正则表达式使用REGEXP关键字来指定匹配模式。常见的正则表达式符号包括&#xff1a; .&#xff1a;匹配任意单个字符 ^&#xff1a;匹配字符串的开始位置 $&#xff1a;匹配字符串的结束位置 *&#xff1a;匹配前面的字符或字符集出现零次或多次 &#xff1a;匹配前面…