哈希算法题目:数组的度
字数 1020 2025-10-29 11:31:55
哈希算法题目:数组的度
题目描述
给定一个非空且只包含非负数的整数数组 nums,数组的“度”定义为数组中任一元素出现频数的最大值。你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,并返回其长度。
示例:
- 输入:
nums = [1,2,2,3,1]
输出:2
解释:数组的度是 2(元素 1 和 2 均出现 2 次)。最短子数组需包含所有频数等于度的元素,例如[2,2]或[1,2,2,1],但最短的是[2,2](长度为 2)。 - 输入:
nums = [1,2,2,3,1,4,2]
输出:6
解释:度的值为 3(元素 2 出现 3 次),最短子数组需包含所有 2 的出现位置,即[2,2,3,1,4,2](长度为 6)。
解题过程
步骤 1:理解问题核心
- 需要先确定数组的“度”,即最高频数。
- 多个元素可能达到最高频数,需对所有这类元素分别计算其首次和末次出现的位置,以确定包含该元素所有出现的最短子数组长度。
- 最终答案为所有这类子数组长度的最小值。
步骤 2:记录每个元素的关键信息
使用哈希表存储每个元素的以下信息:
count:出现次数。first:首次出现的索引。last:末次出现的索引。
遍历数组时:
- 若元素首次出现,记录其索引为
first。 - 每次遇到该元素时更新
count和last索引。
步骤 3:计算最高频数与最短子数组
- 遍历哈希表,找到最大频数(度)。
- 对所有频数等于度的元素,计算
last - first + 1得到子数组长度。 - 取所有此类长度的最小值。
步骤 4:示例推导
以 nums = [1,2,2,3,1,4,2] 为例:
-
构建哈希表:
- 元素 1: count=2, first=0, last=4
- 元素 2: count=3, first=1, last=6
- 元素 3: count=1, first=3, last=3
- 元素 4: count=1, first=5, last=5
-
最高频数(度)为 3(元素 2)。
-
对元素 2:子数组长度 = 6 - 1 + 1 = 6。
-
无其他元素频数为 3,故答案为 6。
关键点总结
- 通过哈希表一次遍历记录每个元素的频数及首末位置。
- 子数组必须包含所有频数等于度的元素,因此需覆盖该元素的全部出现位置。
- 时间复杂度 O(n),空间复杂度 O(n)。