题目
难度:★★★☆☆
类型:数组
方法:前缀和
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组(的长度)。
示例
示例 1:
输入: [0,1]
输出: 2
说明: [0, 1] 是具有相同数量0和1的最长连续子数组。
示例 2:
输入: [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。
注意: 给定的二进制数组的长度不会超过50000。
解答
我们这样设想,把数组中的所有零看做1,准备一个变量s,用来存储从第一个元素开始,一直到第n个元素的和,如果绘制出s关于n的函数图像,就可以看到这是一条有上升也有下降的折线,在这条折线上,纵坐标相等的点对应的横坐标index1和index2,(index1<index2),意味着数组中下标从index1到index2之间的所有元素的和为零,也就是原始数组中零的个数和1的个数相等。在遍历的过程中,我们随时搜寻是否存在这样的区间,计算它们之间的横坐标差值并随时的记录最大值,即可获取最终结果。这里我们使用哈希表来进行横纵坐标的对应。
class Solution:
def findMaxLength(self, nums):
dp, cur, res = {0: -1}, 0, 0
for idx, num in enumerate(nums):
cur += 1 if num == 1 else -1
res = max(res, idx - dp.setdefault(cur, idx))
return res
如有疑问或建议,欢迎评论区留言~
有关更多力扣中等题的python解决方案,请移步力扣中等题解析