和为k的倍数的连续子序列

题目是leetcode0974 和可被k整除的子数组

给定一个数组,以及目标k,求所有和为k的倍数的连续子序列

输入:
    nums = [45, 2, 3, 9, 1, 5]
    k = 6
输出:
    [[3, 9], [45, 2, 3, 9, 1], [3, 9, 1, 5], [1, 5]]

类似前缀和的想法,考虑前i项和modk等于0, 1, ..., k-1的和,模k同余的项之间的连续子序列之和为k的倍数。可以用一个字典来记住这些模k同余的项。

import collections

def solution(A, k):
    n = len(A)
    summ = 0
    ans = []
    sol_map = collections.defaultdict(list)
    sol_map[0] = [0]  # 空子序列的和为0 
    for i in range(1, n+1): # 从第1个数到第n个数
        summ = (A[i-1] + summ) % k
        if sol_map[summ]:
            for idx in sol_map[summ]:
                ans.append(A[idx: i])
        sol_map[summ].append(i)
    return ans

如果只是想数个数,字典改为模k同余的项的个数即可

import collections

def solution2(A, k):
    n = len(A)
    summ = 0
    ans = 0
    sol_map = collections.defaultdict(int)
    sol_map[0] = 1  # 空子序列的和为0
    for i in range(1, n+1):
        summ = (A[i-1] + summ) % k
        if sol_map[summ]:
            ans += sol_map[summ]
        sol_map[summ] += 1
    return ans

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值