https://leetcode.com/problems/continuous-subarray-sum/

1. Use brute force:

  1. //Time Limit Exceeded
  2. class Solution {
  3. public:
  4. bool checkSubarraySum(vector<int>& nums, int k) {
  5. if(nums.size()==0) return false;
  6. int len = nums.size();
  7. if(k==0){
  8. bool zero = false;
  9. for(int i=0; i<len; i++){
  10. if(nums[i] == 0) zero = true;
  11. }
  12. if(!zero) return false;
  13. }
  14. for(int i=0; i<len; i++){
  15. for(int j=0; j<len; j++){
  16. //cout << i << j << endl;
  17. if(checkSum(nums, k, i, j)) return true;
  18. }
  19. }
  20. return false;
  21. }
  22. private:
  23. bool checkSum(vector<int>& nums, int k, int head, int tail){
  24. if(head>=tail) return false;
  25. //cout << head << tail << endl;
  26. int sum = 0;
  27. for(int i=head; i<=tail; i++){
  28. sum += nums[i];
  29. }
  30. //cout << "sum: " << sum << endl;
  31. if(k == 0 && sum == 0)
  32. return true;
  33. if(k!=0 && sum % k == 0)
  34. return true;
  35. return false;
  36. }
  37. };

2. Use hashmap:

  1. //need to review later
  2. //24 ms 9.3 MB
  3. class Solution {
  4. public:
  5. bool checkSubarraySum(vector<int>& nums, int k) {
  6. if(nums.size()==0) return false;
  7. int len = nums.size();
  8. int sum = 0; int prev = 0;
  9. unordered_set<int> modk;
  10. for(int i=0; i<len; i++){
  11. sum += nums[i];
  12. int mod;
  13. if(k==0)
  14. mod = sum;
  15. else
  16. mod = sum % k;
  17. //cout << sum << endl;
  18. //cout << mod << endl;
  19. //cout << prev << endl;
  20. if (modk.count(mod)) return true;
  21. modk.insert(prev);
  22. prev = mod;
  23. /*
  24. cout << "-" << endl;
  25. for (const int& x: modk)
  26. cout << " " << x;
  27. cout << endl;
  28. */
  29. }
  30. return false;
  31. }
  32. };