前缀和 + hash表(力扣刷题)

eg.力扣典型例题

560. 和为 K 的子数组 - 力扣(LeetCode)

974. 和可被 K 整除的子数组 - 力扣(LeetCode)

525. 连续数组 - 力扣(LeetCode)

前缀和 + hash表的关键步骤:

1、进入循环

2、根据题意设置hash[0]

3、计算前缀和sum

4、hash表:key => sum  , value => 当前前缀和的个数(下标)

5、比较当前sum和之前的sum(hash[sum])的关系

6、更新答案

7、继续循环

eg.560. 和为 K 的子数组 - 力扣(LeetCode)

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 

子数组是数组中元素的连续非空序列。

class Solution
{
    vector<int> pre_s;

public:
    int subarraySum(vector<int> &nums, int k)
    {
        unordered_map<int, int> hash;
        hash[0] = 1; // 因为前缀和为0的长度为1 所以hash[0]储存1

        int ans = 0, sum = 0; // 初始化
        for (int i : nums)
        {                             // 开始循环
            sum += i;                 // 计算前缀和
            if (hash[sum - k])        // 如果之前出现满足题意的sum
                ans += hash[sum - k]; // 更新答案
            hash[sum]++;              // 如果之前不存在 sum 就储存 当前sum
        }
        return ans;
    }
};

前缀和 + hash表的原理:

核心其实就是判断 当前 sum 是否在之前存在过(通过hash表来实现) 然后根据题意来判断 结果的更新方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值