class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> allsum;
        allsum.insert(make_pair(0,-1));
        int sum=0;
        for(int i=0;i<nums.size();++i)
        {
            sum+=nums[i];
            if(k)sum%=k;
            auto j=allsum.find(sum);
            if(j!=allsum.end())
            {
                if(i-j->second>1)return true;
            }
            allsum.insert(make_pair(sum,i));
        }
        return false;
    }
};

1

之前见过的题结果还是没搞定, 思路是没问题的,但是细节处理错导致不能ac;  本题要求连续的子数组之和是k的倍数, 看起来好像要求和, 其实是用减法来做加法,  任何一个子数组的和= 前n个数的和-前m个数的和, m<n

2

注意题目要求subarry最少2个,所以这里必须存索引, 同时需要判断当前的索引i 和 j的关系;  如果没要求2个, 可以把map换成set

3

k为0的情况, 这里有点奇怪,题目并不认为任意数是0的倍数....  但0又是0的倍数, 我也是搞不懂什么鬼, 所以不能写出if k==0 return true/false的判断

4

边界考虑, 如果前n个数组就已经符合了,但是map里面是空的! 然后就认为找不到答案..  所以记得初始化一下, key=0  value=-1, 表明前 -1 个元素的和为0