哈希算法题目:连续数组
字数 1285 2025-10-31 22:46:15
哈希算法题目:连续数组
题目描述
给定一个二进制数组 nums(即数组元素只包含 0 和 1),你需要找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
示例
输入:nums = [0,1,0]
输出:2
解释:最长连续子数组是 [0,1] 或 [1,0],长度为 2。
解题思路
-
问题转化
- 若将 0 视为 -1,则问题转化为:寻找最长的子数组,其元素和为 0。
- 例如,
[0,1,0]转化为[-1,1,-1],子数组[-1,1]的和为 0。
-
核心思想
- 使用前缀和记录当前累计和。
- 若两个位置的前缀和相等,说明这两个位置之间的子数组和为 0(即 0 和 1 数量相等)。
- 用哈希表存储每个前缀和首次出现的位置,后续遇到相同前缀和时计算距离。
-
关键细节
- 初始前缀和为 0 时,位置设为 -1(处理从数组开头开始的子数组)。
- 遍历时更新前缀和,并检查是否已存在相同前缀和。
步骤详解
步骤 1:初始化
- 创建哈希表
map,键为前缀和,值为该前缀和首次出现的索引。 - 初始状态:前缀和 0 出现在索引 -1,即
map[0] = -1。 - 初始化变量
prefix_sum = 0和max_length = 0。
步骤 2:遍历数组
- 遍历每个元素
num:- 若
num == 0,prefix_sum -= 1; - 若
num == 1,prefix_sum += 1。
- 若
步骤 3:检查前缀和是否出现过
- 若当前
prefix_sum存在于map中:- 计算当前索引
i与首次出现索引map[prefix_sum]的距离:length = i - map[prefix_sum]。 - 更新
max_length = max(max_length, length)。
- 计算当前索引
- 若
prefix_sum未出现过,将(prefix_sum, i)存入哈希表。
步骤 4:返回结果
- 遍历结束后,
max_length即为所求。
示例推导(nums = [0,1,0])
- 初始化:
map = {0: -1},prefix_sum = 0,max_length = 0。 - i=0, num=0:
prefix_sum = -1,未在 map 中出现 →map = {0: -1, -1: 0}。
- i=1, num=1:
prefix_sum = 0,存在于 map 中 →length = 1 - (-1) = 2,max_length = 2。
- i=2, num=0:
prefix_sum = -1,存在于 map 中 →length = 2 - 0 = 2,max_length = 2。
- 返回
max_length = 2。
复杂度分析
- 时间复杂度:O(n),只需一次遍历。
- 空间复杂度:O(n),哈希表最多存储 n 个前缀和。
通过这种转化和哈希表的应用,可高效解决“连续数组”问题。