leetcode 连续的子数组和 中等

 

 

前缀和+贪心+取模就行.

见代码

class Solution {
public:
    bool checkSubarraySum(const vector<int>& nums, int k) {
        // preSum[i] % k 与其对应的下标的映射.
        // 贪心: 题目要求子数组次数至少为 2, 所以能够出现的长度越长越好, 即只存 第一次出现的映射就行
        unordered_map<int, int> map;
        int preSum = 0;
        map[0] = -1;        // 初始化
        for(int i = 0; i < nums.size(); ++ i) {
            preSum += nums[i];
            if(map.find(preSum % k) != map.end() && i - map[preSum % k] > 1) {
                return true;
            }
            if(map.find(preSum % k) == map.end()) map[preSum % k] = i;
        }
        return false;
    }
};

 

posted @ 2021-09-20 15:38  rookie_Acmer  阅读(11)  评论(0编辑  收藏  举报