哈希算法题目:连续数组
字数 1285 2025-10-31 22:46:15

哈希算法题目:连续数组

题目描述
给定一个二进制数组 nums(即数组元素只包含 0 和 1),你需要找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

示例
输入:nums = [0,1,0]
输出:2
解释:最长连续子数组是 [0,1][1,0],长度为 2。


解题思路

  1. 问题转化

    • 若将 0 视为 -1,则问题转化为:寻找最长的子数组,其元素和为 0。
    • 例如,[0,1,0] 转化为 [-1,1,-1],子数组 [-1,1] 的和为 0。
  2. 核心思想

    • 使用前缀和记录当前累计和。
    • 若两个位置的前缀和相等,说明这两个位置之间的子数组和为 0(即 0 和 1 数量相等)。
    • 用哈希表存储每个前缀和首次出现的位置,后续遇到相同前缀和时计算距离。
  3. 关键细节

    • 初始前缀和为 0 时,位置设为 -1(处理从数组开头开始的子数组)。
    • 遍历时更新前缀和,并检查是否已存在相同前缀和。

步骤详解

步骤 1:初始化

  • 创建哈希表 map,键为前缀和,值为该前缀和首次出现的索引。
  • 初始状态:前缀和 0 出现在索引 -1,即 map[0] = -1
  • 初始化变量 prefix_sum = 0max_length = 0

步骤 2:遍历数组

  • 遍历每个元素 num
    • num == 0prefix_sum -= 1
    • num == 1prefix_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])

  1. 初始化:map = {0: -1}, prefix_sum = 0, max_length = 0
  2. i=0, num=0:
    • prefix_sum = -1,未在 map 中出现 → map = {0: -1, -1: 0}
  3. i=1, num=1:
    • prefix_sum = 0,存在于 map 中 → length = 1 - (-1) = 2max_length = 2
  4. i=2, num=0:
    • prefix_sum = -1,存在于 map 中 → length = 2 - 0 = 2max_length = 2
  5. 返回 max_length = 2

复杂度分析

  • 时间复杂度:O(n),只需一次遍历。
  • 空间复杂度:O(n),哈希表最多存储 n 个前缀和。

通过这种转化和哈希表的应用,可高效解决“连续数组”问题。

哈希算法题目:连续数组 题目描述 给定一个二进制数组 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 个前缀和。 通过这种转化和哈希表的应用,可高效解决“连续数组”问题。