leetcode523. 连续的子数组和

和第974题一样,求数组的一个区间是否能被k整除,由于不能统计个数,所以不用字典,哈希表就行。

  1. 我们要判断的是(sum[j]−sum[i])%K是否等于 0。
  2. 根据 mod运算的性质,我们知道 (sum[j]−sum[i])%K=sum[j]%K−sum[i]%K=0。
  3. 所以对于i的前面如果有sum[j]%K = sum[i]%K说明符合条件
  4. 题目要求区间长度大于2,这里可以延迟pre进入set的时间来完成
  5. 注意我们在初始时必须加上0,因为如果是nums=[i],k=9,它自身算一个。这种对后面所有能整除K的nums[i]都要算上它自身
def checkSubarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        pre = 0
        mp = set()
        for num in nums:
            last = pre
            pre += num
            pre %= k
            if pre % k in mp:
                return True
            mp.add(last)
        return False

写个延迟K位的,和上述思路一致,就是要延迟k位将pre%k加入哈希表,因为有的题目要求区间的最小长度
下面是延迟一位的,k位就是i-k。

def checkSubarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        mp = set()
        pre = [0]
        for i in nums:
            pre.append(pre[-1]+i)
        for i in range(len(nums)+1):
            pre[i] %= k
            if pre[i] in mp:
                return True 
            if i >= 1:
                mp.add(pre[i-1])
        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值