zoukankan      html  css  js  c++  java
  • 力扣560题(前缀和技巧解决子数组问题)

    560、和为k的子数组

    基本思想:

    前缀和技巧

    具体实现:

    举例[1,1,0,1,1]    k=2

    字典num_times存储的是每一个前缀和出现的次数

    {0:1, 1:1, 2:2, 3:1, 4:1}

    假如到达下标为4的位置时,前缀和为4,

    4-k=2,

    前面出现了几次2,说明以下标4结尾的和为2的连续字数租的个数有多少个

    代码:

    class Solution:
        def subarraySum(self, nums: List[int], k: int) -> int:
            # num_times 存储某“前缀和”出现的次数,这里用collections.defaultdict来定义它
            # 如果某前缀不在此字典中,那么它对应的次数为0
            num_times = collections.defaultdict(int)
            num_times[0] = 1  # 先给定一个初始值,代表前缀和为0的出现了一次
            cur_sum = 0  # 记录到当前位置的前缀和
            res = 0
            for i in range(len(nums)):
                cur_sum += nums[i]  # 计算当前前缀和
                if cur_sum - k in num_times:  # 如果前缀和减去目标值k所得到的值在字典中出现,即当前位置前缀和减去之前某一位的前缀和等于目标值
                    res += num_times[cur_sum - k]
                # 下面一句实际上对应两种情况,一种是某cur_sum之前出现过(直接在原来出现的次数上+1即可),
                # 另一种是某cur_sum没出现过(理论上应该设为1,但是因为此处用defaultdict存储,如果cur_sum这个key不存在将返回默认的int,也就是0)
                # 返回0加上1和直接将其置为1是一样的效果。所以这里统一用一句话包含上述两种情况
                num_times[cur_sum] += 1
            return res

     1248、统计【最美子数组】

    代码:

    class Solution:
        def numberOfSubarrays(self, nums: List[int], k: int) -> int:
            num_times = collections.defaultdict(int)
            num_times[0] = 1  # 先给定一个初始值,代表出现奇数个数为0的次数为去
            cur_odd = 0  # 记录到当前位置的奇数个数
            res = 0
            for i in range(len(nums)):
                if nums[i] % 2 != 0:
                    cur_odd += 1
                num_times[cur_odd] += 1
                if cur_odd - k in num_times:  
                    res += num_times[cur_odd - k]
            return res
  • 相关阅读:
    [数字信号处理]离散傅里叶变换及其性质
    [数字信号处理]序列的逆z变换
    [数字信号处理]序列的z变换
    [数字信号处理]从傅里叶级数到傅里叶变换
    [物理]简谐振动总结
    [数字信号处理]常系数差分方程
    [数字信号处理]时域离散系统
    [数字信号处理]入门基本概念
    团队作业6-复审与事后分析
    Alpha阶段项目复审
  • 原文地址:https://www.cnblogs.com/zhaojiayu/p/14781939.html
Copyright © 2011-2022 走看看