前言
聚焦算法题实战,系统讲解核心板块。优选算法部分剖析动态规划、二分法等高效策略,学会寻找'最优解'。递归与回溯掌握问题分解与状态回退,攻克组合排列难题。贪心算法理解从局部到全局的思路,解决区间调度等问题。内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。
31. 连续数组
题目链接:
题目描述:

题目示例:

解法(前缀和 + 哈希表)
算法思路
稍微转换一下题目,就会变成我们熟悉的题型。
本题让我们找出一段连续的区间,其中 0 和 1 出现的次数相同。如果将 0 记为 -1,1 记为 1,问题就变成了找出一段区间,这段区间的和等于 0。
找到在 [0, i-1] 区间内,第一次出现 sum[i] 的位置即可。
于是,就和之前做过的那个和为 k 的子数组的题思路类似了。

设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和。
想知道最大的【以 i 结尾的和为 0 的子数组】,就要找到从左往右第一个 x1 使得 [x1, i] 区间内所有元素的和为 0。那么 [0, x1-1] 区间内的和是不是就是 sum[i] 了。于是问题就变成:
我们还是不用真的初始化一个前缀和数组,因为我们只关心 位置之前,第一个前缀和等于 的位置,因此,我们仅需用一个哈希表,一边求当前位置的前缀和,一边记录第一次出现该前缀和的位置。






