Leetcode和可被k整除的子数组

在这里插入图片描述
我的想法:
按常规思路保存之前的前缀和,结果超时

class Solution:
    def subarraysDivByK(self, nums: List[int], k: int) -> int:
        list_sum=0
        pre_sum_list=[]
        ans=0
        for num in nums:
            list_sum+=num
            if list_sum%k==0:
                ans+=1
            pre_sum_list.append(list_sum)
            for pointer in range(0,len(pre_sum_list)-1):
                if (list_sum-pre_sum_list[pointer])%k==0:
                    ans+=1
        return ans 

标准解法:

class Solution:
    def subarraysDivByK(self, nums: List[int], k: int) -> int:
        cnt = [1]+[0]*(k-1)
        som,ans = 0,0
        for num in nums:
            som += num
            cnt[som%k]+=1
        for i in cnt:
            ans += i*(i-1)//2
        return ans

其他思路:
需要推出p[j] % k = p[i - 1] % k是关键
在这里插入图片描述

class Solution:
    def subarraysDivByK(self, nums: List[int], k: int) -> int:
        # 用hash表记录模值出现的次数
        records = dict({0: 1})
        prefix_sum = 0
        result = 0
        for num in nums:
            # 求出每个元素对应的的前缀和
            prefix_sum += num
            # 求出每个元素对K的模
            mod = prefix_sum % k
            # 模值出现的次数
            count = records.get(mod, 0)
            # 累加次数
            result += count
            # 更新hash表中保存的次数
            records[mod] = count + 1
        return result

链接:https://leetcode.cn/problems/subarray-sums-divisible-by-k/solution/974-qian-zhui-he-he-ke-bei-k-zheng-chu-d-5ozp/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值