《算法题讲解指南:优选算法-前缀和》--29.和为k的子数组,30.和可被k整除的子数组

《算法题讲解指南:优选算法-前缀和》--29.和为k的子数组,30.和可被k整除的子数组

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

29. 和为k的子数组

题目链接:

题目描述:

题目示例:

解法(前缀和+哈希表):

算法思路:

C++算法代码:

算法总结及流程解析:

30. 和可被k整除的子数组

题目链接:

题目描述:

题目示例:

解法(前缀和+哈希表):

前置知识补充:

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


29. 和为k的子数组

题目链接:

560. 和为 K 的子数组 - 力扣(LeetCode)

题目描述:

题目示例:

解法(前缀和+哈希表):

算法思路:

      设 i 为数组中的任意位置,用 sum[ i ] 表示 【0,i】区间内所有元素的和。
      想知道有多少个【以 i 结尾的和为 k 的子数组】,就要找到有多少个起始位置为 x1,x2, x3……,使得【x,i】区间内所有元素的和 k 。那么【0,x】区间内的和是不是就是 sum[ i ] - k 了。于是问题就变成:

  • 找到在【0,i - 1】区间内,有多少前缀和等于 sum[ i ] - k 的即可。

      我们其实也不用真的初始化一个前缀和数组,因为我们只关心在 i 位置之前,有多少个前缀和等于 sum[ i ] - k 。因此,我们仅需要用一个哈希表,一边求当前位置的前缀和,一边存下之前每一种前缀和出现的次数。

C++算法代码:

class Solution { public: int subarraySum(vector<int>& nums, int k) { unordered_map<int, int> hash; hash[0] = 1; int count = 0; int sum = 0; for(int i = 0; i < nums.size(); i++) { sum += nums[i]; if(hash[sum - k]) { count += hash[sum - k]; } hash[sum]++; } return count; } };

算法总结及流程解析:

30. 和可被k整除的子数组

题目链接:

974. 和可被 K 整除的子数组 - 力扣(LeetCode)

题目描述:

题目示例:

解法(前缀和+哈希表):

前置知识补充:

同余定理:
      如果 (a - b) % n == 0,那么我们就可以得到一个结论:a % n == b % n。用文字叙述就是,如果两个数相减的差能够被 n 整除,那么这两个数对 n 取模的结果相同
      例如:(26 - 2) % 12 == 0,那么 26 % 12 == 2 % 12 == 2。

C++ 中负数取模的结果,以及修正【负数取模】的结果:

  • C++ 中关于负数的取模运算,结果是【把负数当成正数,取模之后的结果加上一个负号】。 例如:-1 % 3 = -(1 % 3) = -1
  • 因为有负数,为了防止发生【出现负数】的结果,以 (a % n + n) % n 的形式输出保证为正。例如:-1 % 3=(-1 % 3 + 3)% 3 = 2
算法思路:

      思路与上一题类似

      设 i 为数组中的任意位置,用 sum[ i ] 表示 【0,i】区间内所有元素的和。

  • 想知道有多少个【以 i 为结尾的可被 k 整除的子数组】,就要找到有多少个起始位置为 x1,x2,x3…… ,使得【x,i】区间内所有元素的和可被 k 整除。
  • 设【0,x - 1】区间内所有元素之和等于 a ,【0,i】区间内所有元素的和等于 b,可得:  (b - a)% k == 0 。
  • 由同余定理可得,【0,x - 1】区间与【0,i】区间内的前缀和同余。于是问题就变成:找到在【0,i - 1】区间内,有多少前缀和的余数等于 sum[ i ] % k 的即可

      这里我们也不用真的初始化一个前缀和数组,因为我们只关心在 i 位置之前,有多少个前缀和等于 sum[ i ] % k。但是这个我们需要处理一下,确保不会为负数。因此,我们仅需用一个哈希表一边求当前位置的前缀和,一边存下之前每一种前缀和出现的次数

C++算法代码:

class Solution { public: int subarraysDivByK(vector<int>& nums, int k) { unordered_map<int, int> hash; int count = 0; int sum = 0; int rem = 0; hash[0] = 1; //这里的0表示i位置前缀和正好被k整除 for(auto i : nums) { sum += i; rem = sum % k; if(rem < 0) //负数 % 正数 -> 负数 —> 需要修正为正数 -> 负数+k { rem += k; } if(hash[rem]) //同余定理:(a - b)/p = k -> (a - b)%p == 0 -> a%p == b%p { count += hash[rem]; } hash[rem]++; } return count; } };

算法总结及流程解析:

结束语

      到此,29.和为k的子数组,30.和可被k整除的子数组 这两道算法题就讲解完了。两道题均采用前缀和+哈希表方法,通过统计前缀和出现的次数来快速计算符合条件的子数组数量。第二题在类似思路基础上结合同余定理,处理了负数取模问题。希望大家能有所收获!

Read more

中兴B863AV3.1-M2卡刷固件实战:从萌虎动画到无线网卡全解析

1. 中兴B863AV3.1-M2卡刷固件入门指南 第一次接触中兴B863AV3.1-M2刷机的朋友可能会觉得有些复杂,但其实只要跟着步骤来,整个过程并不难。这个固件最大的亮点就是加入了萌虎动画和无线网卡支持,让原本功能受限的机顶盒焕发新生。 我去年第一次刷这个固件时也踩过不少坑,比如U盘格式不对、刷机按键时机没掌握好等等。后来反复尝试了几次,终于摸清了门道。现在我的盒子开机就能看到可爱的萌虎动画,还能用USB无线网卡连接WiFi,彻底摆脱了网线的束缚。 这个固件适合哪些人呢?首先你得有个中兴B863AV3.1-M2的盒子,或者兼容的魔百盒E900V22C/D系列。其次最好有些基础的刷机经验,至少知道怎么进Recovery模式。如果你是纯小白,建议先看看其他基础教程练练手。 2. 萌虎动画的实现原理与定制 2.1 萌虎动画的技术解析 这个固件最吸引人的就是那个虎年主题的开机动画了。我拆解过这个动画包,发现它其实是由一系列PNG图片组成的bootanimation.zip。这个压缩包放在/system/media/目录下,包含三个关键部分: * desc.txt:定义动

By Ne0inhk

用GLM-4.6V-Flash-WEB做智能阅卷系统,老师都说好

用GLM-4.6V-Flash-WEB做智能阅卷系统,老师都说好 在教育信息化不断推进的今天,传统人工阅卷模式正面临效率低、主观性强、反馈慢等多重挑战。尤其是在大规模考试场景中,教师需要花费大量时间批改客观题与基础主观题,难以将精力集中在教学设计与学生个性化指导上。尽管已有OCR+规则引擎的自动化方案,但其对复杂排版、手写体识别和语义理解的支持仍显不足。 而随着多模态大模型的发展,一种全新的智能阅卷范式正在浮现。智谱推出的 GLM-4.6V-Flash-WEB 视觉大模型,凭借其轻量化架构、高效推理能力和开箱即用的部署方式,为构建低成本、高可用的智能阅卷系统提供了理想选择。本文将详细介绍如何基于该镜像实现一个支持图像输入、自动识别题目内容并完成评分建议的智能阅卷系统,并分享实际落地中的关键优化策略。 1. 背景与需求分析 1.1 教育场景下的阅卷痛点 当前中小学及高校日常测验中,试卷形式多样,包括: * 扫描版PDF或拍照上传的学生答卷 * 包含印刷体文字、手写答案、图形标注等多种元素 * 题型涵盖选择题、填空题、简答题等 传统解决方案如纯OCR工具(Tesser

By Ne0inhk
Claude Code免费使用教程,前端必看!

Claude Code免费使用教程,前端必看!

目前claude有两种使用方式,一种是官方购买渠道(太贵了,用不起,扎心。。。),还一种就是通过api方式,就是下面我讲的通过any-router提供的api调通就行~相当于中转站,主要是免费啊,谁能说不香! 1.注册LinuxDo账户 目前AnyRouter取消了github登录方式,只能通过LinuxDo账户登录,或者edu的邮箱登录,这里选择使用LinuxDo登录。 linux do官方网址:https://linux.do/   linux do邀请码:2E917F23-D9BF-44FE-BCBD-AE6AB3B1FC17 提示:如果Linuxdo邀请码失效,注册页面填写邀请码的那个输入框下面有邀请码链接,如图: 申请理由稍微写写,别全打逗号啥的,认真写下很快就过了。   2.any Router登录使用 上面linux do账号注册完毕就可以,登录any router了 any router网址:https://anyrouter.top/register?aff=iVs0    (貌似目前需要挂绿色软件才能登录上去) 一定要复制上面的网址(别删

By Ne0inhk