classSolution { public: intsubarraySum(vector<int>& nums, int k){ for (int i = 1; i < nums.size(); ++i) nums[i] += nums[i - 1]; int ret = 0; for (int i = 0, sub = 0; i < nums.size(); ++i) { for (int j = i; j < nums.size(); ++j) { if (nums[j] - sub == k) ++ret; } sub = nums[i]; } return ret; } };
肉眼可见的平方级/2. 虽然通过了, 但效率极低
the best solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: intsubarraySum(vector<int>& nums, int k){ int sum=0; unordered_map<int,int> h; h[0]++; int count=0; for (int i=0; i < nums.size(); i++) { sum += nums[i]; if ( h.count(sum - k) ) count += h[sum-k]; ++h[sum]; } return count; } };
所以说思路啊 = = …
很简单的, 核心是 sum - k, 其含义是符合的已走距离, 比如当前 sum 是 10, 而 k 为 2. 那么所有之前 sum 为 8 的点, , 其距离至当前点的和都可以满足条件. 这也是为什么 0 一开始初始化为 1 的原因. 因为那等同于起点.