优选算法——前缀和(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.嗟食

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

期待与佬的再次相遇~

相关推荐
Chester_19996 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
裕晟资质规划7 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
会周易的程序员7 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
小灰灰搞电子8 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化8 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
en.en..8 小时前
C语言 标准输入 / 输出缓冲区
算法
吃好睡好便好10 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球10 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
小灰灰搞电子11 小时前
C++ 引用折叠详解
c++
靠沿11 小时前
贪心算法专题(二)
算法·贪心算法