题目描述
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
题目描述
解题思考
版本一:一开始我想的是使用当前长度除以和的方法进行判断,当当前长度是累计和的两倍时,说明0和1的个数相等,这里的解题思路有一个漏洞,如果当前和一直为0,那么和作为除数显然是不合法的。后面又考虑数0和1的个数,显得过于繁琐。后面参考其他大牛的思路,说首先将0转换成-1,该问题就变成了求前缀和的问题。使用0转化成-1的思路,可以使用双层循环实现,但是会超出时间限制。
版本二:这里考虑优化时间复杂度。使用字典数据以及前缀和的思路。首先做对应关系,将0变成-1,1保持不变。而后做前缀和,如果当前前缀和在之前有出现相同的和值,那么必有连续子数组的和为0(满足条件),比较两个前缀和的下标差,即当前子字串的长度,与标杆长度做比较更新。否则将当前和放入字典中。
代码实现
版本一实现:
class Solution(object):
def findMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sum=0
leng=0
for k in range(len(nums)):
if nums[k]==0:
nums[k]=-1
for i in range(len(nums)):
sum= nums[i]
for j in range(i+1,len(nums)):
sum+=nums[j]
if sum == 0:
if j-i+1 >leng:
leng=j-i+1
return leng
版本二实现:
class Solution(object):
def findMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
curSum=0
res=0
preSum={0:-1}
number={0:-1,1:1}
for i in range(len(nums)):
curSum+=number[nums[i]]
if curSum in preSum:
res=max(res,i-preSum[curSum])
else:
preSum[curSum]=i
return res
性能评估
心得:解锁Python中的字典序知识。昨天我还误以为要自己实现哈希表。原来是不一样的名号,一样的功能。
每日一语:不积硅步,无以至千里;不积小流,无以成江海。