1. 程式人生 > >leetcode 560和為k的連續子數

leetcode 560和為k的連續子數

第一次嘗試= = 是我太年輕了,以為可以一次過,現在想來不累加是不行了。

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;
    }
};