和相同的二元子数组

这篇博客介绍了两种方法来解决LeetCode上的子数组求和问题。方法一是利用哈希表存储前缀和及其出现次数,通过遍历数组计算结果。方法二是使用前缀和与滑动窗口,但由于时间复杂度过高可能导致超时。这两种方法展示了在数组操作中哈希表和前缀和的有效应用。
摘要由CSDN通过智能技术生成

题目出处:https://leetcode-cn.com/problems/binary-subarrays-with-sum/
在这里插入图片描述
方法一:哈希表
思路:对于区间(i, j],满足Sum[j]-Sum[i]=goal时,就找到一个符合条件的解。用哈希表维护在位置j之前各个前缀和出现的次数,枚举右边界j,在哈希表中查询出现在j之前的Sum[j]-goal的数量,将每个位置j的结果做累加即可。

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int sum = 0;
        unordered_map<int, int> cnt;
        int ret = 0;
        for (auto& num : nums) {
            cnt[sum]++;
            sum += num;
            ret += cnt[sum - goal];
        }
        return ret;
    }
};

方法二:前缀和+滑动窗口(超时)

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int ans = 0;
        int n = nums.size();
        vector<int> PreSum(n+1, 0);
        for(int i = 0; i < n; ++i){
            PreSum[i+1] = PreSum[i] + nums[i];  //PreSum(i+1)前i个数的前缀和                
        } 
        
        int l = 0;
        while(l < n){
            int r = l;
            int sum = 0;
            while(r < n){
                sum = PreSum[r+1]-PreSum[l+1]+nums[l];
                ++r;
                if(sum == goal){
                    ++ans; 
                }
                if(sum > goal){
                    break;
                } 
            }
            ++l;
        }

        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值