Leetcode 【930. 和相同的二元子数组】【统计「优美子数组」】【974. 和可被 K 整除的子数组】【前缀和思想】

这道题目是经典的求 子数组之和=goal的个数,用map维护。

但是笔者在实现的过程中发现0的情况不是很好出来,问题在于mp[sum]和sum+=num的代码语句存在位置问题。后来看了下代码还是自己没有考虑清楚。

这种类型的题目就是要想清楚你的做法,以及边界条件。

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        map<int,int> mp;
        int n=nums.size();
        // mp[0]=1;
        int sum=0,ans=0;
        for(int i=0;i<n;i++){
            int num=nums[i];
            mp[sum]++;
            sum+=num;
            if(mp[sum-goal]){
                ans+=mp[sum-goal];
            }
        }
        return ans;
    }
};

下面这道题目可以看成上面这道题目的衍生。

这道题目转化成求子数组和为k的个数。一下就能A出来

class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        for(int i=0;i<nums.size();i++){
            nums[i]=nums[i]%2;
        }
        int sum=0,ans=0;
        map<int,int> mp;
        for(int i=0;i<nums.size();i++){
            mp[sum]++;
            sum+=nums[i];
            ans+=mp[sum-k];
        }
        return ans;

    }
};

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        map<int,int> mp;
        int sum=0,ans=0;
        int n=nums.size();
        for(int i=0;i<n;i++){
            mp[sum]++;
            sum+=nums[i];
            sum=sum%k;
            ans+=mp[k+sum];
            ans+=mp[sum];
            ans+=mp[sum-k];
        }
        return ans;
    }
};
posted @ 2024-03-28 10:41  pengge666  阅读(3)  评论(0编辑  收藏  举报