lettcode-和为K的子数组

问题

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

思路(今天也是崇拜官方的一天)

刚开始的思路是窗口,具体就是设定一个窗口,然后如果这个窗口内的数据大于k,那么就让窗口前面抛弃一个值,否则窗口扩充,但是后来当k=0的时候死活过不去,所以放弃!
官方的解答和微妙,就是正常人的思路,如果我想知道当前值之前有没有存在和为k的子数组,那么就用当前值减去k得到的pre,看pre这个值是是之前的前缀和
那么现在问题就是构建前缀和了,所以就采用一个map哈希作为记录
更多可以看官方解答:官方解答

代码(c++)

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map <int,int> data;
        data[0]=1;//初始化,当数据是从0开始加时,加1
        int result=0;
        int pre=0;
        for(int i=0;i<nums.size();i++){
            pre+=nums[i];
            if(data.find(pre-k)!=data.end()) result+=data[pre-k];
            data[pre]++;//如果存在data[pre]为2的情况,那就说明前面的值部分被正负抵消了
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值