https://leetcode.com/problems/continuous-subarray-sum/description/
这道题跟https://leetcode.com/problems/subarray-sum-equals-k/description/ 其实是很像的,但本题的特点就是corner case非常多…
class Solution { public: bool checkSubarraySum(vector<int>& nums, int k) { if (k < 0) k = -1 * k; else if (k == 0) { // check if there's continuous zeroes bool has_zero = false; for (int num : nums) { if (num == 0) { if (has_zero == true) return true; has_zero = true; } else has_zero = false; } return false; } if (k == 1 && nums.size() > 1) // tricky but... return true; int sum = 0; unordered_set<int> sum_records; vector<int> targets = {k}; int last_num = INT32_MAX; sum_records.insert(0); for (int num : nums) { sum += num; sum_records.insert(sum); if (last_num == 0 && num == 0) return true; // n = 0 while (targets.back() + k <= sum) targets.push_back(targets.back() + k); // prvents calculating dup multiplies for (int target : targets) { if (num != target && sum_records.count(sum - target) > 0) return true; } last_num = num; } return false; } };