《算法题讲解指南:优选算法-前缀和》--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

ubuntu-24.04安装配置rime(中州韵)输入法

ubuntu-24.04安装配置rime(中州韵)输入法

由于搜狗输入法版本较老,在ubuntu-24.04上总是有些毛病,遂尝试使用社区较好的rime输入法。 笔者前前后后也是踩了不少坑,故做一次记录,也希望对各位有用。 有关rime的一些基础知识 安装前先介绍一下rime的相关知识,这样对于后续的操作就比较易于理解,遇到问题也容易解决。 详细参见rime中州韵小狼毫 保姆级安装配置教程 100种增强功能_小狼毫输入法100+增强功能-ZEEKLOG博客 1、rime与小狼毫、中州韵、鼠须管有什么关系? rime全平台通用,不过在不同平台有着不同的名字;windows叫小狼毫,linux叫中州韵,mac上叫鼠须管。 2、rime和東風破有什么关系? 東風破是中州韻輸入引擎的配置管理工具,更易于管理rime的第三方包(比如笔者使用的雾凇)。東風破安装可选,但是强烈推荐。 3、rime自定义配置好用吗? 包好用的;只要搞明白.custom.yaml以及部署流程(并不难,在配置部分会讲)。 注意:针对windows、macos、linux(ibus、fcitx)有不同的配置文件,不同平台请勿错用。 输入法平台主配置文

By Ne0inhk
【图文】Codex接入Kimi K2/GLM-4.6 环境配置指南 (Windows/macOS/Ubuntu)

【图文】Codex接入Kimi K2/GLM-4.6 环境配置指南 (Windows/macOS/Ubuntu)

Codex接入Kimi K2/GLM-4.6 环境配置指南 (Windows/macOS/Ubuntu) 前言 紧跟DeepSeek的步伐,智谱也在节前发布了GLM-4.6,并称它是智谱"最强的代码Coding模型(较GLM-4.5提升27%)" * 代码能力对齐Claude Sonnet 4,部分榜单对齐Claude Sonnet 4.5。 * 上下文长度增加到200K。 * 推理能力提升,增加图像识别与搜索能力。 * token消耗较GLM-4.5节省30%以上。 GLM Coding Plan订阅自动升级至GLM-4.6(包含已订阅的用户): * 支持Claude Code、Roo Code、Kilo Code、Cline等10+主流编程工具。 * 套餐命名对齐Claude,用量为Claude x3,费用为Claude x1/7,

By Ne0inhk
Flutter 三方库 vy_string_utils 的鸿蒙化适配指南 - 实现高效的字符串模式校检、支持富文本清洗与多维度命名规范转换

Flutter 三方库 vy_string_utils 的鸿蒙化适配指南 - 实现高效的字符串模式校检、支持富文本清洗与多维度命名规范转换

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 vy_string_utils 的鸿蒙化适配指南 - 实现高效的字符串模式校检、支持富文本清洗与多维度命名规范转换 前言 在进行 Flutter for OpenHarmony 开发时,字符串处理几乎无处不在。从校验用户输入的手机号,到将后台返回的 snake_case 字段转化为鸿蒙 UI 需要的文本格式,这类基础工作如果通过硬编码实现,会产生大量的冗余逻辑。vy_string_utils 是一款轻量级却功能强悍的字符串工具包。它通过一系列精心设计的扩展方法,让鸿蒙开发者能以极简的语法管理所有文本流。本文将带大家领略这款“字符串手术刀”的威力。 一、原理解析 / 概念介绍 1.1 基础原理 vy_string_utils 基于 Dart

By Ne0inhk
Flutter 三方库 flutter_test_config 的鸿蒙化适配指南 - 实现具备全局上下文配置与测试桩自动化注入的质量管理中心、支持端侧测试资源预加载与环境归一化实战

Flutter 三方库 flutter_test_config 的鸿蒙化适配指南 - 实现具备全局上下文配置与测试桩自动化注入的质量管理中心、支持端侧测试资源预加载与环境归一化实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_test_config 的鸿蒙化适配指南 - 实现具备全局上下文配置与测试桩自动化注入的质量管理中心、支持端侧测试资源预加载与环境归一化实战 前言 在进行 Flutter for OpenHarmony 的大规模质量建设时,我们经常需要为整个项目的测试用例配置统一的参数。例如:为所有 UI 测试注入统一的字体包、配置模拟的鸿蒙屏幕尺寸,或者在每个测试开始前重置分布式数据库状态。flutter_test_config 是 Flutter 官方提供的一种特殊的配置机制,用于在测试执行前注入全局逻辑。本文将探讨如何在鸿蒙端构建极致、专业的全局测试治理中心。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过在 test 目录下搜索名为 flutter_test_config.dart 的特殊入口文件,

By Ne0inhk