优选算法——前缀和(6):和可被 K 整除的子数组

🔥近津薪荼: 个人主页 🎬个人专栏: 《近津薪荼的算法日迹》 《Linux操作系统及网络基础知识分享》 《c++基础知识详解》 《c语言基础知识详解》 ✨不要物化,矮化,弱化,钝化自己,保持锋芒,不要停止学习 这个世界上只有两个人真正在注意着你 八岁的你,和八十岁的你, 他们此刻正在注视着你, 一个希望你 勇敢开始 ,一个希望你 不留遗憾


1.上期参考代码

cpp 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        hash[0]=1;//初始化hash
        int sum=0,ret=0;
        for(int i=0;i<nums.size();i++)
        {
            sum+=nums[i];
            ret+=hash[sum-k];//先汇总
            hash[sum]++;//后将新的和加入,目的是规避k=0的错判
        }
        return ret;
    }
};

2.本期知识点导图

3.本期要讲解的题目是

和可被 K 整除的子数组

这是一道往年的蓝桥杯真题,思路和上一题大相径庭

大家尝试看完解析之后,能不能自己吧代码写出来~

要点:

  • 本质关键的还是子数组求和方法

4.解题

4.1 暴力解法:

暴力枚举,时间复杂度O(N3)

4.2优解

由于数组的元素有负数和0,通上一期的题目一样,不可使用双指针算法优化

同样的

数组求和,考虑前缀和算法

接着根据条件,在前n项和的变式上做文章

这里就要给大家补充

两个知识点了

  • 同余定理:

若两个整数 a 和 b 除以正整数 k 所得的余数相同,则称 a 和 b 对模 k 同余

同余的两个数有如下性质:

  • cpp中的模运算%

cpp中的%的结果的正负号看的是根据被模数来的,我们要求的事取余的结果,余数必须是正数,所以要进行修正:加上一个模即可,然后考虑到要和正数的情况相统一,我们得到以下的求余数的公式:((a%b)+k)&k,得到的结果就是我们想要的正数余数

补充完这两个知识点,我想大家应该也能想到这题的思路了吧

利用同于定理,将目标值映射到前缀和数组上来

细节

整体细节和上期相同,只有第三点:

当a=b时,a-b=0,满足条件,但是我们每次只统计到前缀和数组i-1及之前位置元素的余数r,这种情况在i位置,统计不到,所以要给hash0%k一个初始值1

代码逻辑

  • 初始化hash,ret,sum
  • 进入循环
  • 求i位置前缀和
  • 求sum的余数r
  • 汇总哈希表i-1及之前位置等于r的前缀和的个数
  • i位置的前缀和进入哈希表

5.下期要讲解的题目是:

连续数组

6.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦
佬的支持就是我前进的最大动力 ~

期待与佬的再次相遇~

相关推荐
持力行3 小时前
从C struct到C++中的class
c语言·c++
:-)5 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
GIS阵地6 小时前
QgsRasterDataProvider 完整详解(QGIS 3.40.13 C++)
开发语言·c++·qt·开源软件·qgis
charlie1145141918 小时前
Cinux: 为大内核铺路
开发语言·c++·操作系统·现代c++
Jerry9 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发10 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星10 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮10 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
肖爱Kun10 小时前
C++设计策略模式
开发语言·c++·策略模式
dream_home840710 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务