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

《算法闯关指南:优选算法--前缀和》--29.和为k的子数组,30.和可被k整除的子数组
在这里插入图片描述

🔥草莓熊Lotso:个人主页
❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:

在这里插入图片描述

文章目录


前言:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。

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++算法代码:

classSolution{public:intsubarraySum(vector<int>& nums,int k){ unordered_map<int,int>hash; hash[0]=1;int sum=0,ret=0;for(auto x:nums){ sum+=x;if(hash.count(sum-k)) ret+=hash[sum-k]; hash[sum]++;}return ret;}};

算法总结&&笔记展示:

笔记字有点丑,大家见谅:

在这里插入图片描述

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++算法代码:

classSolution{public:intsubarraysDivByK(vector<int>& nums,int k){ unordered_map<int,int> hash; hash[0%k]=1;int sum=0,ret=0;for(auto x:nums){ sum+=x;int r=(sum%k+k)%k;//修正后的余数if(hash.count(r)) ret+=hash[r]; hash[r]++;}return ret;}};

算法总结&&笔记展示:

笔记字有点丑,大家见谅:

在这里插入图片描述

结尾:

🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点: 👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用 💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑 🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解 技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标! 

结语:聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。

✨把这些内容吃透超牛的!放松下吧✨ʕ˘ᴥ˘ʔづきらど

Read more

基于飞算JavaAI的在线图书借阅平台设计与实现

基于飞算JavaAI的在线图书借阅平台设计与实现

引言 在数字化转型背景下,高校图书管理系统面临智能化升级需求。本文以飞算JavaAI为开发工具,通过智能引导式开发流程,实现一个包含用户管理、图书借阅、权限控制等核心功能的在线平台。系统采用Spring Boot + MyBatis技术栈,结合飞算AI的代码生成能力,将传统3周的开发周期压缩至3天,验证了AI辅助开发在Java企业级应用中的高效性。 文章目录 * 引言 * 飞算介绍 * 环境准备 * 1. 下载“IDEA” * 2.安装 * 3. 下载“飞算Java AI”扩展 * 4.登录 * 需求分析与规划 * 核心功能模块 * 技术选型 * 系统实现 * 1. 自然语言描述需求 * 2. 理解需求 * 3. 设计接口 * 4. 表结构设计 * 5. 处理逻辑接口 * 6. 生成源码 * 优化与调试心得 * 遇到的问题 * 调试技巧 * 成果展示与总结

By Ne0inhk
【Java 多线程】:线程状态 & 线程操作 & 线程同步

【Java 多线程】:线程状态 & 线程操作 & 线程同步

📃个人主页:island1314 ⛺️  欢迎关注:👍点赞 👂🏽留言 😍收藏  💞 💞 💞 🚀 前言 之前我们在这篇博客 【Java多线程】:理解线程创建、特性及后台进程  里面已经讲了多线程的基础内容了,现在就要面对多线程的最大问题了,让我们来看看吧 1. 线程的生命周期及状态转换 在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期。 * 当 Thread 对象创建完成时,线程的生命周期便开始了 * 当run()方法中的代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时,线程的生命周期便会结束。 * 在线程的整个生命周期中,线程可能处于不同的状态 *  例如,线程在刚刚创建完成时处于新建状态,线程在执行任务时处于运行状态 * 在线程的整个生命周期中,其基本状态一共有6种,分别是新建(New)状态、可运行(Runnable)状态、锁阻塞(Blocked)状态、无限等待(Waiting)状态、

By Ne0inhk
Java 面试必问:JVM 运行时数据区域详解(附内存结构图)

Java 面试必问:JVM 运行时数据区域详解(附内存结构图)

文章目录 * 1. 程序计数器(线程私有) * 2. Java 虚拟机栈(线程私有) * 3. 本地方法栈(线程私有) * 4. 堆(线程共享) * 5. 方法区(线程共享) 在 Java 面试中,JVM 内存结构几乎是必问知识点。很多人可以背出程序计数器、虚拟机栈、本地方法栈、堆和方法区这五个区域,但当面试官继续追问它们的作用、线程共享关系以及对象为什么在堆上时,往往就难以解释清楚。本文主要面对面试八股文速成选手,将从 JVM 的整体内存布局出发,带你系统梳理五大运行时数据区域的作用与常见面试考点。 JVM 运⾏时数据区域也叫内存布局,但需要注意的是它和 Java 内存模型((Java Memory Model,简称 JMM)完全不同,属于完全不同的两个概念,它由以下 5 ⼤部分组成:

By Ne0inhk
Spring Boot 3 新特性详解与迁移指南:从 Java 17 到云原生最佳实践

Spring Boot 3 新特性详解与迁移指南:从 Java 17 到云原生最佳实践

Spring Boot 3 新特性详解与迁移指南:从 Java 17 到云原生最佳实践 前言:截至 2026 年 2 月,Spring Boot 3.x 已成为企业级 Java 开发的事实标准。根据最新调研,阿里、字节、腾讯等头部大厂已 100% 完成 Spring Boot 3.2.x 的迁移,3.5.x 作为 3.x 系列的最后一个重大版本,将维护至 2026 年 6 月。然而,从 Spring Boot 2.

By Ne0inhk