思路:
令sum[p]表示p位置的前缀和。如果sum[i] % k == sum[j] % k (j - i > 1),则存在子段(i, j]的和能够整除k。
实现:
1 class Solution 2 { 3 public: 4 bool checkSubarraySum(vector<int>& nums, int k) 5 { 6 if (nums.size() < 2) return false; 7 int n = nums.size(); 8 for (int i = 0; i < n - 1; i++) 9 if (nums[i] == 0 && nums[i + 1] == 0) 10 return true; 11 if (k == 0) return false; 12 int sum = 0; 13 unordered_map<int, int> m; 14 m[0] = -1; 15 for (int i = 0; i < n; i++) 16 { 17 sum = (sum + nums[i]) % k; 18 if (m.count(sum)) 19 { 20 if (i - m[sum] > 1) 21 return true; 22 } 23 else m[sum] = i; 24 } 25 return false; 26 } 27 };