class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
}
};
523. 连续的子数组和
给你一个整数数组 nums
和一个整数 k
,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:
k
的倍数。如果存在,返回 true
;否则,返回 false
。
如果存在一个整数 n
,令整数 x
符合 x = n * k
,则称 x
是 k
的一个倍数。0
始终视为 k
的一个倍数。
示例 1:
输入:nums = [23,2,4,6,7], k = 6 输出:true 解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。
示例 2:
输入:nums = [23,2,6,4,7], k = 6 输出:true 解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42 。 42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。
示例 3:
输入:nums = [23,2,6,4,7], k = 13 输出:false
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 109
0 <= sum(nums[i]) <= 231 - 1
1 <= k <= 231 - 1
相似题目
原站题解
cpp 解法, 执行用时: 192 ms, 内存消耗: 111 MB, 提交时间: 2023-07-05 10:17:47
class Solution { public: bool checkSubarraySum(vector<int>& nums, int k) { int m = nums.size(); if (m < 2) { return false; } unordered_map<int, int> mp; mp[0] = -1; int remainder = 0; for (int i = 0; i < m; i++) { remainder = (remainder + nums[i]) % k; if (mp.count(remainder)) { int prevIndex = mp[remainder]; if (i - prevIndex >= 2) { return true; } } else { mp[remainder] = i; } } return false; } };
python3 解法, 执行用时: 88 ms, 内存消耗: 36 MB, 提交时间: 2023-07-05 10:17:06
class Solution: def checkSubarraySum(self, nums: List[int], k: int) -> bool: m = len(nums) if m < 2: return False mp = {0: -1} remainder = 0 for i, num in enumerate(nums): remainder = (remainder + num) % k prevIndex = mp.get(remainder) if prevIndex != None: if i - prevIndex >= 2: return True else: mp[remainder] = i return False
golang 解法, 执行用时: 144 ms, 内存消耗: 12.7 MB, 提交时间: 2023-07-05 10:13:14
func checkSubarraySum(nums []int, k int) bool { m := len(nums) if m < 2 { return false } mp := map[int]int{0: -1} remainder := 0 for i, num := range nums { remainder = (remainder + num) % k if prevIndex, has := mp[remainder]; has { if i-prevIndex >= 2 { return true } } else { mp[remainder] = i } } return false }
javascript 解法, 执行用时: 100 ms, 内存消耗: 62.8 MB, 提交时间: 2023-07-05 10:12:58
/** * @param {number[]} nums * @param {number} k * @return {boolean} */ var checkSubarraySum = function(nums, k) { const m = nums.length; if (m < 2) { return false; } const map = new Map(); map.set(0, -1); let remainder = 0; for (let i = 0; i < m; i++) { remainder = (remainder + nums[i]) % k; if (map.has(remainder)) { const prevIndex = map.get(remainder); if (i - prevIndex >= 2) { return true; } } else { map.set(remainder, i); } } return false; };
java 解法, 执行用时: 21 ms, 内存消耗: 58.3 MB, 提交时间: 2023-07-05 10:12:43
class Solution { public boolean checkSubarraySum(int[] nums, int k) { int m = nums.length; if (m < 2) { return false; } Map<Integer, Integer> map = new HashMap<Integer, Integer>(); map.put(0, -1); // 哈希表, key为前i个数和除以k的余数 int remainder = 0; for (int i = 0; i < m; i++) { remainder = (remainder + nums[i]) % k; if (map.containsKey(remainder)) { // 存在已有的余数, 则两个余数的key之间的序列可能满足 int prevIndex = map.get(remainder); if (i - prevIndex >= 2) { return true; } } else { map.put(remainder, i); } } return false; } }