和可被k整除的子数组问题
和可被k整除的子数组问题
一·题目:leetcode链接:. - 力扣(LeetCode) 二·思路:思路:前缀和第二种表示方式即循环列出方式+同余定理+取模修正:还是通过循环把它分为由0到i的位置一次由i位置往前走去组合,即可以得到所有的情况,因此要判断x%k=0即转化为(sum-前缀和)%k成立即可 即由同余定理——>满足sum%k=前缀和%k 通俗一点也就是通过for循环每次遍历前缀和
和可被k整除的子数组问题
leetcode链接:. - 力扣(LeetCode)
思路:前缀和第二种表示方式即循环列出方式+同余定理+取模修正:
还是通过循环把它分为由0到i的位置一次由i位置往前走去组合,即可以得到所有的情况,因此要判断x%k=0即转化为(sum-前缀和)%k成立即可 即由同余定理——>
满足sum%k=前缀和%k 通俗一点也就是通过for循环每次遍历前缀和(sumi之前的sum)都放入了hash,当遍历到i位置,只需要判断hash中是否对应sum%k下标是否存在值即可
注意:存在负数和0,不能用滑动窗口。
三·代码:
代码语言:javascript代码运行次数:0运行复制class Solution {
public:
int subarraysDivByK(vector<int>& nums, int k) {
int sum=0,ret=0;
unordered_map<int,int> hash;
hash[0%k]=1;//特殊情况,这如果恰好x为此时的sumi那么对应的就是前缀和为0,即若它是,则此时hash【0】必然有数即初始化为1;
for(auto a:nums){
sum+=a;
int remainder=(sum%k+k)%k;//这里进行了修正处理原因是如果余数出现负数,则可能会有情况不符合如:【-1,2,9】,k=2这里
//2是一个子数组,但是sum加到2,此时余数是1,而hash没有对应1的下标只有-1(-1%2)故这时可以通过修正把它变为1
if((remainder)) ret+=hash[remainder];//上下顺序不能颠倒,如果颠倒则无论如何这个if肯定为真
hash[remainder]++;
}
return ret;
}
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-2,如有侵权请联系 cloudcommunity@tencent 删除数组hashintsum遍历 #感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-18 19:34:43
上一篇:连续数组问题
推荐阅读
留言与评论(共有 5 条评论) |
本站网友 定西论坛 | 30分钟前 发表 |
这如果恰好x为此时的sumi那么对应的就是前缀和为0 | |
本站网友 蜀汉路 | 7分钟前 发表 |
因此要判断x%k=0即转化为(sum-前缀和)%k成立即可 即由同余定理——>满足sum%k=前缀和%k 通俗一点也就是通过for循环每次遍历前缀和(sumi之前的sum)都放入了hash | |
本站网友 好读书打一字 | 6分钟前 发表 |
int subarraysDivByK(vector<int>& nums | |
本站网友 cba季后赛赛程 | 13分钟前 发表 |
三·代码:代码语言:javascript代码运行次数:0运行复制class Solution { public |