【前缀和】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;
}
};


目录
相关文章
|
SQL 数据格式
视图有哪些特点?哪些使用场景?
视图有哪些特点?哪些使用场景?
|
网络协议 网络架构
NAT 原理与实验操作
NAT 原理与实验操作
|
存储 Cloud Native NoSQL
etcd 的简介以及发展历史
## 一、简介 etcd 是一个开源、分布式、一致性的键值存储系统。它是由 CoreOS(后来被 Red Hat 收购)开发的,旨在提供一个可靠的分布式协调服务。etcd 通常用于在分布式系统中进行配置管理、服务发现、分布式锁、选举等任务。 etcd 的特点包括: - **分布式一致性**:基于 Raft 共识算法,etcd 确保数据在分布式环境中的一致性和可靠性。 - **键值存储**:提供类似于 NoSQL 数据库的键值对存储功能。 - **高可用性**:通过多节点部署、自动故障转移等方式提高服务的可用性。 - **易于使用**:提供简单的 HTTP 和 gRPC API 进行数据操
328 1
|
弹性计算 关系型数据库 MySQL
经济型e实例试用评测
通过几个通俗易懂的入门实验快速认识e实例
48762 3
经济型e实例试用评测
|
存储 JavaScript 开发者
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
199 0
|
前端开发 JavaScript Java
千帆大模型平台多维度体验总结——平台使用以及接口调用小游戏开发
千帆大模型平台多维度体验总结——平台使用以及接口调用小游戏开发
655 0
|
安全 网络安全 数据安全/隐私保护
研发国产操作系统的重要使命
众所周知,随着国家科技实力的提升和信息化建设的推进,国产操作系统的研发和推广已经成为了一个非常重要的任务。作为国家信息安全和核心技术的重要组成部分,国产操作系统不仅能够提高我国信息化建设的自主能力,还能够保障我国信息安全和核心技术的安全性和可控性。因此,研发国产操作系统已经成为了一项非常重要的使命。而且经过国产操作系统的不断发展和壮大,越来越多的人开始关注国产操作系统,并对其未来发展充满期待。其中,龙蜥操作系统作为我国自主研发的一款操作系统,已经受到了广泛的关注和认可。那么本文就来聊聊国产操作系统相关的内容。
863 2
研发国产操作系统的重要使命
|
关系型数据库 Linux API
Linux 内存管理新特性:Memory folios 解读
本文主要讲解folio ,极其在应用中的直接价值。
|
机器学习/深度学习 算法 Python
学习笔记: 机器学习经典算法-决策树(Decision Tress)
机器学习经典算法-个人笔记和学习心得分享
464 0
|
JavaScript 前端开发 UED
Vue中的动态DOM加载:实现更灵活的前端界面
Vue.js是一个流行的JavaScript框架,提供了强大的工具来构建交互式和动态的前端界面。在本博客中,我们将深入探讨Vue中动态加载DOM的方法和实例,以帮助您创建更灵活、响应式的用户界面。
642 0