https://leetcode.com/problems/continuous-subarray-sum/description/
https://leetcode.com/problems/continuous-subarray-sum/discuss/99512/Python-with-explanation.-62ms-Time-O(min(n-k))-mostly 这里讲解的很好。
其实关键点就是一个: Sum1 - sum0 == n * k <==> sum1和sum0同余数。 以及因为要求>1个数,所以得处理下余数是0的情况
不知道为啥用map比用set快
class Solution { public: bool checkSubarraySum(vector<int>& nums, int k) { if (k == 0) { int cnt = 0; for (int i = 0; i < nums.size(); i++) { if (i > 0 && nums[i-1] == 0 && nums[i] == 0) return true; } return false; } k = k >= 0 ? k : -k; if (nums.size() >= 2 * k) return true; unordered_map<int, int> data; unordered_set<int> prefix; int s = 0; // prefix.insert(0); for (int i = 0; i < nums.size(); i++) { s += nums[i]; int v = s % k; // data[v] ++; // if (data[v] >= 2) return true; if (v == 0 && s != 0 && nums[i] % k) return true; if (prefix.find(v) != prefix.end() ) { return true; } else { prefix.insert(s % k); } } return false; } };
class Solution { public: bool checkSubarraySum(vector<int>& nums, int k) { if (k == 0) { int cnt = 0; for (int i = 0; i < nums.size(); i++) { if (i > 0 && nums[i-1] == 0 && nums[i] == 0) return true; } return false; } k = k >= 0 ? k : -k; if (nums.size() >= 2 * k) return true; unordered_map<int, int> data; unordered_set<int> prefix; int s = 0; // prefix.insert(0); for (int i = 0; i < nums.size(); i++) { s += nums[i]; int v = s % k; data[v] ++; if (data[v] >= 2) return true; if (v == 0 && s != 0 && nums[i] % k) return true; // if (prefix.find(v) != prefix.end() && nums[i] != k) { // return true; // } else { // prefix.insert(s - k); // } } return false; } };