您的位置:首页 > 房产 > 建筑 > 赤峰酒店网站建设哪家便宜_昆明新增疫情最新消息_磁力猫torrentkitty官网_网站建设多少钱

赤峰酒店网站建设哪家便宜_昆明新增疫情最新消息_磁力猫torrentkitty官网_网站建设多少钱

2025/4/6 1:00:01 来源:https://blog.csdn.net/qq_64604732/article/details/146540313  浏览:    关键词:赤峰酒店网站建设哪家便宜_昆明新增疫情最新消息_磁力猫torrentkitty官网_网站建设多少钱
赤峰酒店网站建设哪家便宜_昆明新增疫情最新消息_磁力猫torrentkitty官网_网站建设多少钱

🔥 找出最长交替子数组:奇偶交替且偶数开头的子数组问题

🎯 题目描述

给定一个整数数组 nums 和一个整数 threshold,找出满足以下条件的最长子数组

  1. 偶数开头:子数组的第一个元素是偶数(nums[l] % 2 == 0)。
  2. 奇偶交替:相邻元素奇偶性不同(nums[i] % 2 != nums[i+1] % 2)。
  3. 元素不超限:所有元素 ≤ threshold

返回子数组的长度,若不存在符合条件的子数组,返回 0。

🌰 典型示例

输入数组输出解释
[3, 2, 5, 4], 53子数组 [2, 5, 4] 满足所有条件
[1, 2], 21子数组 [2] 满足条件
[2, 3, 4, 5], 43子数组 [2, 3, 4] 满足条件

🧠 思路分析

✨ 核心观察

  1. 偶数起点:子数组必须以偶数开头,因此遍历数组时,仅当遇到偶数且 ≤ threshold 时,才尝试扩展子数组。
  2. 奇偶交替:每次扩展子数组时,检查当前元素与前一个元素的奇偶性是否不同。
  3. 阈值过滤:任何元素超过 threshold 时,立即终止当前子数组的扩展。

🚀 算法策略

  • 双指针法:使用 start 标记子数组起点,i 作为遍历指针。
  • 单次遍历:外层循环遍历所有可能的起点,内层循环扩展子数组直到不满足条件。
  • 状态维护:仅需记录当前子数组的长度和奇偶性状态,空间复杂度为 O(1)

💻 代码实现(Java)

基础版(暴力枚举)

class Solution {public int longestAlternatingSubarray(int[] nums, int threshold) {int maxLength = 0;int n = nums.length;for (int start = 0; start < n; start++) {// 检查起点:偶数且 ≤ thresholdif (nums[start] % 2 != 0 || nums[start] > threshold) {continue;}int currentLength = 1; // 起点本身长度为 1for (int i = start + 1; i < n; i++) {// 检查当前元素:奇偶交替且 ≤ thresholdif (nums[i] % 2 != nums[i-1] % 2 && nums[i] <= threshold) {currentLength++;} else {break; // 不满足条件,终止扩展}}maxLength = Math.max(maxLength, currentLength); // 更新最长长度}return maxLength;}
}

优化版(双指针法)

class Solution {public int longestAlternatingSubarray(int[] nums, int threshold) {int maxLength = 0;int start = 0, i = 0; // 双指针:start 记录起点,i 遍历数组while (i < nums.length) {start = i; // 尝试以 i 为起点i++;// 起点必须是偶数且 ≤ thresholdif (nums[start] % 2 != 0 || nums[start] > threshold) {continue;}// 扩展子数组直到不满足条件while (i < nums.length && nums[i] % 2 != nums[i-1] % 2 && nums[i] <= threshold) {i++;}// 更新最长长度(i - start 为当前子数组长度)maxLength = Math.max(maxLength, i - start);}return maxLength;}
}

📊 复杂度分析

算法时间复杂度空间复杂度
基础版O(n²)O(1)
双指针优化版O(n)O(1)

✨ 优化点

  • 双指针优化:通过单次遍历(每个元素最多访问 2 次),将时间复杂度从 O (n²) 优化到 O (n)。
  • 状态压缩:无需记录中间状态,仅用指针和长度变量即可完成计算。

📝 关键步骤解析

  1. 起点检查

    • 仅当元素是偶数且 ≤ threshold 时,作为子数组起点(nums[start] % 2 == 0 && nums[start] ≤ threshold)。
  2. 扩展子数组

    • 从起点开始,逐个检查后续元素:
      • 奇偶交替(nums[i] % 2 != nums[i-1] % 2)。
      • 元素 ≤ thresholdnums[i] ≤ threshold)。
    • 满足条件则延长子数组,否则终止扩展。
  3. 更新结果

    • 每次扩展结束后,计算当前子数组长度(i - start),并更新最长长度。

🧪 示例解析(以优化版代码为例)

示例 1:nums = [3, 2, 5, 4]threshold = 5

  1. 起点 start=1(元素 2,偶数且 ≤5)
    • 扩展子数组:
      • i=2(5,奇,与前偶不同,≤5 → 长度 2)。
      • i=3(4,偶,与前奇不同,≤5 → 长度 3)。
    • 最长长度更新为 3

示例 2:nums = [1, 2]threshold = 2

  1. 起点 start=1(元素 2,偶数且 ≤2)
    • 无后续元素,长度 1

示例 3:nums = [2, 3, 4, 5]threshold = 4

  1. 起点 start=0(元素 2,偶数且 ≤4)
    • 扩展子数组:
      • i=1(3,奇,与前偶不同,≤4 → 长度 2)。
      • i=2(4,偶,与前奇不同,≤4 → 长度 3)。
      • i=3(5,>4 → 终止)。
    • 最长长度 3

❗ 边界条件处理

  1. 全奇数数组:无符合条件的子数组,返回 0
  2. 元素超过阈值:遇到超过阈值的元素,立即终止当前子数组扩展。
  3. 单个元素:若元素是偶数且 ≤阈值,长度为 1

🌟 总结

✨ 核心条件

  • 偶数开头 + 奇偶交替 + 元素不超限

🚀 最优解法

  • 双指针遍历:单次扫描完成,时间复杂度 O (n)。
  • 关键技巧:利用指针标记起点,动态扩展子数组,避免重复计算。

💡 同类问题扩展

  • 允许奇数开头:修改起点条件为奇数。
  • 奇偶连续(非交替):检查相邻元素奇偶性相同。

📚 参考资料

  • LeetCode 原题:最长交替子数组
  • 算法思想:双指针法、贪心策略。

🎨 可视化流程图(双指针移动过程)

初始化:start=0, i=0, maxLength=0  
↓  
遍历数组:  if 起点合法(偶数且 ≤ threshold):  扩展子数组直到不满足条件(奇偶交替且 ≤ threshold)  更新 maxLength(i - start)  
↓  
返回 maxLength  

✨ 博客排版建议

  1. 标题分层:使用 ###### 区分章节(如**🔥 标题**、🎯 题目描述)。
  2. 代码高亮:使用 Java 代码块,标注关键注释(如起点检查、扩展条件)。
  3. 表格对比:用表格展示基础版与优化版的复杂度差异。
  4. 互动问题:在结尾提问:“如何处理包含负数的数组?(提示:奇偶性判断与负数无关)”。

通过以上结构,博客兼顾可读性技术性,适合算法学习者理解双指针法的应用。可补充双指针移动动画示例执行流程图,进一步提升内容的直观性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com