leetcode 560和为k的连续子数

版权声明://若需转载,请各位大虾注明出处,小生在此有礼. https://blog.csdn.net/sos768/article/details/83003854

第一次尝试= = 是我太年轻了,以为可以一次过,现在想来不累加是不行了。

1.TO
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int count=0,sum=0;
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
            if(sum==k) count++;
            if(sum>=k){
                sum=0;
                i--;
            }
        }
        return count;
    }
};
2.累加数组尝试
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        vector<int>sum=nums;
        int key=0;
        for(int i=1;i<nums.size();i++){
            sum[i]=sum[i-1]+nums[i];
        }
        for(int i=0;i<sum.size();i++){
            if(sum[i]==k) ++key;
            for(int j=i-1;j>=0;j--){
                if(sum[i]-sum[j]==k)++key;
        }
    }
            
        return key;
    }
};
虽然成功过了,但效率明显不是十分的高。
3.hashmap尝试
这种方法博主还没熟练掌握,需要深入了解的可以去论坛再看看。
下面引用另一个博主的代码,并已经手打了一遍,希望可以在之后遇到该类题目时能够有多一种思路,代码以下;
对于{0,1}键值对的初始化是因为sum-k=0时候之前是没法存在的,所以需要提前初始化操作,同时当sum-k存在时,在此之前肯定也存在有sum=k的存在,但这样操作时候对时间和空间的要求都降低了好多,也是我们对算法的要求提高了许多,好了不多bb,以下是博主借助了论坛的大佬之力后完成的代码,希望对大家解题有所帮助。值得一提的是,看见有将map换成undered_map 的虽然降低了空间复杂度,但在时间度上却提高了许多....若有看法,欢迎共同讨论。
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        map<int, int> m{{0,1}};
        int sum=0,res=0;
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
            res+=m[sum-k];
            ++m[sum];
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/sos768/article/details/83003854
今日推荐