(011)0和1个数相同的子数组---2022/03/24

题目描述

给定一个二进制数组 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中的字典序知识。昨天我还误以为要自己实现哈希表。原来是不一样的名号,一样的功能。
每日一语:不积硅步,无以至千里;不积小流,无以成江海。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值