从左往右遍历,借助前缀和的思想,遍历到的位置作为子数组的末尾,那么看看前边是否存在合理的位置满足他俩之间的和为k
也就是判断前边是否有值为 当前位置的前缀和-k 的前缀和,如果有直接加上表示这几个位置都满足。
同样的从左往右保证了只会取到当前遍历位置的前边的位置,即使后边还有满足前缀和为该值的但不会造成影响,
class Solution { public: int subarraySum(vector<int>& nums, int k) { /* int res=0; for(int i=0;i<nums.size();i++) { int temp=0; for(int j=i;j<nums.size();j++) { temp+=nums[j]; if(temp==k) { res+=1; } } } return res; */ int res=0; int pre=0; unordered_map<int,int> m; m[0]=1; for(int i=0;i<nums.size();i++) { pre+=nums[i]; if(m.count(pre-k)) { res+=m[pre-k]; } m[pre]++; } return res; } };