【前缀和】974. 和可被 K 整除的子数组

简介: 同样的,本题利用了前缀和的定理.当(pre[i]-pre[j-1])mod k==0时.即为所寻找的答案.

Halo,这里是Ppeua。平时主要更新C++,数据结构算法,Linux与ROS…感兴趣就关注我bua!


974. 和可被 K 整除的子数组


c1103ce101234f5bb5b6cc89c6fcd475.png


题目:


d5ed696f0b70427d99cd075b81415061.png


示例:


a066ef4f27db42ea8e71a5287e7b8513.png


题解:


本题与560.和为K的子数组高度相似


同样的,本题利用了前缀和的定理.当(pre[i]-pre[j-1])mod k==0时.即为所寻找的答案.


将这个式子做简单的变换.则可以得到.pre[i] mod k ==pre[j-1] mod k时即为所寻找的答案.


同样利用hash存储每一次答案.


最后的答案即为以每一个位置为数尾的符合条件的子数组个数之和。需要注意的一个边界条件是,我们需要对哈希表初始化,记录mp[0]=1的情况,这样就考虑了前缀和本身被 k 整除的情况。


由于C++没有对负数取模的操作,所以我们需要对负数的模进行处理,具体的如下:

(sum%k)的结果可能为负数,此时进行如下处理(sum%k+k)%k,


即使是远小于K的负数,其对K同余后,其负数同余值的绝对值都要小于K,所以加上K后再对K同余就是其正数的同余值.


举个例子:


(-33%5+5)%5=2


代码:


class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        for(int i=1;i<nums.size();i++)
        {
            nums[i]+=nums[i-1];
        }
        unordered_map<int,int>map;
        map[0]=1;
        int res=0;
        for(int i=0;i<nums.size();i++)
        {
            int models=((nums[i]%k+k)%k);
            if(map.find(models)!=map.end())
            {
                res+=map[models];
            }
            map[models]++;
        }
        return res;
    }
};


class Solution {
public:
int subarraysDivByK(vector& nums, int k) {
for(int i=1;i<nums.size();i++)
{
nums[i]+=nums[i-1];
}
unordered_map<int,int>map;
map[0]=1;
int res=0;
for(int i=0;i<nums.size();i++)
{
int models=((nums[i]%k+k)%k);
if(map.find(models)!=map.end())
{
res+=map[models];
}
map[models]++;
}
return res;
}
};


ppeua
+关注
目录
打赏
0
0
0
0
10
分享
相关文章
普通人怎么学人工智能?这些隐藏学习秘籍大揭秘,生成式人工智能认证(GAI认证)来助力
在人工智能(AI)快速发展的今天,普通人学习AI已成为必然趋势。本文从明确学习目标与路径、利用多元化资源、注重实践应用、关注GAI认证及持续自我提升五个方面,为普通人提供系统化的AI学习指南。通过设定目标、学习编程语言、参与项目实践和获取专业认证,普通人可逐步掌握AI技能,在未来职场中占据优势并开启智能时代新篇章。
Federated Learning
联邦学习(Federated Learning, FL)是一种新兴的分布式机器学习范式,旨在通过“数据不动模型动”的方式,在不共享原始数据的情况下实现多方协同训练,保护数据隐私。本文综述了国内外研究现状,涵盖学术研究和产业应用进展,分析了其核心特征、技术挑战及未来发展方向,为相关领域的研究者和从业者提供参考。
2025年供应链技术展望:进步、优势与未来挑战
2025年供应链技术展望:进步、优势与未来挑战
CMake参数解析cmake_parse_arguments 的参数用法
CMake参数解析cmake_parse_arguments 的参数用法
282 2
【c语言】玩转文件操作
本文介绍了C语言中文件操作的基础知识,包括文件的打开和关闭、文件的顺序读写、文件的随机读写以及文件读取结束的判定。详细讲解了`fopen`、`fclose`、`fseek`、`ftell`、`rewind`等函数的使用方法,并通过示例代码展示了如何进行文件的读写操作。最后,还介绍了如何判断文件读取结束的原因,帮助读者更好地理解和应用文件操作技术。
182 2
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
152 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等