0
点赞
收藏
分享

微信扫一扫

每日算法系列【LeetCode 523】连续的子数组和


题目描述

给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。

示例1


输入:
[23,2,4,6,7], k = 6
输出:
True
解释:
[2,4] 是一个大小为 2 的子数组,并且和为 6。


示例2


输入:
[23,2,6,4,7], k = 6
输出:
True
解释:
[23,2,6,4,7]是大小为 5 的子数组,并且和为 42。


提示

  • 数组的长度不会超过 10000 。
  • 你可以认为所有数字总和在 32 位有符号整数范围内。

题解

暴力法

每日算法系列【LeetCode 523】连续的子数组和_前缀和

代码

c++


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


python


class Solution:
def checkSubarraySum(self, nums: List[int], k: int) -> bool:
n = len(nums)
if k == 0:
for i in range(1, n):
if nums[i] == 0 and nums[i-1] == 0:
return True
return False
mp = {}
mp[0] = 0
sum = 0
for i in range(n):
sum += nums[i]
sum %= k
if sum not in mp:
mp[sum] = i + 1
elif i + 1 - mp[sum] >= 2:
return True
return False


后记

c++ 有多种实现方法,可以用 map 、hash_map 、unordered_map 等多种数据结构。其中 hash_map 不在标准库里,这里没法使用。理论上 unordered_map 比 map 会快一点,但是实际运行中没有发现差别。

举报

相关推荐

0 条评论