前缀和+贪心+取模就行.
见代码
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; } };