统计能源使用时段

2026 华为OD机试真题 7月22日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

某智慧园区管理系统记录了 N 个连续的能源使用时段,每个时段使用的能源类型用整数表示(1=太阳能,2=风能,3=电能,4=天然气,5=地热能)。

为了优化能源配置,管理员需要分析:在这 N 个时段中,连续使用不超过 2 种能源的最长时段长度是多少?

请编写程序计算这个最大长度。

2026 华为OD机试真题 7月22日华为OD上机新系统考试真题 100 分题型

输入描述

  • 输入是一个整数数组,表示各时段的能源类型
  • 数组元素:1=太阳能,2=风能,3=电能,4=天然气,5=地热能
  • 约束条件:1⩽ 数组长度 ⩽100000,能源类型为 1-5 的整数

输出描述

输出最长连续时段的长度。

补充说明

如果输入为空,则输出 0

示例1

输入

1,2,1,2,3,2,2,2

输出

5

说明

  • 最长满足条件的连续时段是 [2 3 2 2 2](下标 3 到 7),长度 5
  • 该时段只使用了 2 种能源(2 和 3)

示例2

输入

1,2,3,4,5

输出

2

说明

最长的满足条件的连续时段是 2,因为每个时段都不一样。

解题思路

核心思想

题目要求在数组中找到一个最长连续区间,使区间内最多只出现 2 种能源类型。这是典型的滑动窗口问题。

用左右指针维护一个窗口,并用计数表记录窗口内每种能源出现的次数。当窗口内能源类型数量超过 2 时,不断右移左指针并减少对应计数,直到窗口重新满足“最多 2 种能源”。每次窗口合法时,用窗口长度更新答案。

算法步骤

  1. 如果输入数组为空,直接输出
  2. 初始化左指针 left = 0,计数表 count,答案 ans = 0
  3. 右指针从左到右遍历数组,将当前能源加入窗口。
  4. 如果窗口内不同能源类型超过 2,则移动左指针,并同步减少左侧能源的计数。
  5. 当某种能源计数变为 0 时,将它从计数表中删除。
  6. 此时窗口合法,用 right - left + 1 更新最大长度。

复杂度分析

设数组长度为 n

  • 每个元素最多被右指针加入一次、被左指针移出一次,时间复杂度为 O(n)
  • 计数表最多保存 3 种能源的临时状态,空间复杂度为 `O(
THE END