Leetcode 560. Subarray Sum Equals K : 前缀和的技巧与hashmap的使用

  • 无非就是想把所有可能的组合找出来,记下所有满足条件的情况
  • 暴力解,双重循环,复杂度 O ( N 2 ) O(N^2) O(N2)这题中会导致超时
  • 下面介绍一种 O ( N ) O(N) O(N)时间复杂度的解
    • 我无非就是要求所有可能的[i...j] (i<=j)组成的和
    • 之前说了暴力复杂度太高,那就换另一种方法
    • [i...j]组成的和可以看成[0...j-1]的和与[0...i]的和之差,如果分别用J,I来表示,即找到所有的J-I=target
    • 这里可以巧妙地采用hashmap数据结构,hashmap[sum]表示这个和sum,在遍历的过程中出现的次数
      • hashmap[5]=2 表示存在两种前缀和 [ 0... i 1 ] 和 [ 0... i 2 [0...i_1]和[0...i_2 [0...i1][0...i2] 都等于5

补充

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> hashmap;
        int sum=0, cnt=0;
        hashmap[0]=1;
        for(auto& x: nums){
            sum+=x;
            if(hashmap.count(sum-k)){
                cnt+=hashmap[sum-k];
            }
            hashmap[sum]++; // 必须放这里,[前缀]和不包含当前项,返例:如 k = 0,则hashmap[sum]++后, hashmap.count(sum - k) 就发现有值,为1,但实际上并不存在
        }
        return cnt;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值