Continuous Subarray Sum
程序员文章站
2022-04-25 09:52:51
...
1.解析
题目大意,判断是否存在长度至少为2,和是k整数倍的连续子序列。
2.分析
这道题本质上和Contiguous Array是一样的。只不过换了个条件,另外还要注意k = 0情况下的处理。也是要用到子数组和去求解,我想到的是,用一个二层循环,第一个循环标记当前子序列的起始位置,第二个循环是依次将该起始位置作为起始坐标,依次和后面的元素相加,然后判断,这种做法最坏的时间复杂度为O(),不知道为何能OJ;比较巧妙的是,利用Contiguous Array这题的思路,还涉及一个知识点:a % b = c, d % b = c,则(a-d)能整除b;所以,利用这条性质,我们可以用hashtable保存子数组和除以k的余数,如果当前余数出现过,则说明在a和d序列中间存在一段能整除k的子序列。但还有处理以下两种情况:
①k = 0, 则保存子序列和,而不保存子序列和除以k的余数。
②子序列长度至少为2,保存上一个子序列除以k的余数,而不是当前子序列的余数,例如 {23, 6} k = 6,如果保存当前余数,则长度会小于2
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k){
unordered_set<int> rem;
int n = nums.size(), pre = 0, sum = 0;
for (auto num : nums){
sum += num;
int t = k == 0 ? sum : sum % k; //k为0,则保存当前子序列的和
if (rem.count(t)) return true; //当前余数出现过,则存在满足条件的子序列
rem.insert(pre); //保存上一个子序列
pre = t;
}
return false;
}
};
上一篇: 数组的相关方法
下一篇: 移动硬盘打开很慢甚至无法打开该怎么办?
推荐阅读
-
sql中count或sum为条件的查询示例(sql查询count)
-
linux比较两个文件是否一样(linux命令md5sum使用方法)
-
mysql踩坑之limit与sum函数混合使用问题详解
-
Python中使用md5sum检查目录中相同文件代码分享
-
[codewars_python]Sum of Digits / Digital Root
-
基于Python中求和函数sum的用法详解
-
对python中array.sum(axis=?)的用法介绍
-
python 列表,数组和矩阵sum的用法及区别介绍
-
sum(case when then)(判断男女生的个数)
-
对python中矩阵相加函数sum()的使用详解