leetcode 560和為k的連續子數
阿新 • • 發佈:2018-11-23
第一次嘗試= = 是我太年輕了,以為可以一次過,現在想來不累加是不行了。
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; } };