优选算法——前缀和(5):和为 K 的子数组

优选算法——前缀和(5):和为 K 的子数组
示例图

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


1.上期参考代码

classSolution{public: vector<int>productExceptSelf(vector<int>& nums){int n=nums.size(); vector<int>front(n,1);for(int i=1;i<n;i++){ front[i]=front[i-1]*nums[i-1];} vector<int>back(n,1);for(int i=n-2;i>=0;i--){ back[i]=back[i+1]*nums[i+1];} vector<int>ret(n);for(int i=0;i<n;i++){ ret[i]=front[i]*back[i];}return ret;}};

2.本期知识点导图

3.本期要讲解的题目是

和为 K 的子数组

要点:

  • 子数组是数组元素的连续非空排列
  • 注意数组元素有正有负

4.解题

4.1 暴力解法:

暴力枚举,算出所有子数组的和,需嵌套3层循环,时间复杂度O(N3)(前两层枚举子数组左右区间,里层数组求和)

4.2优解

思考

联系我们之前做过双指针,滑动窗口的题,寻找符合条件的子数组,我们这道题目可以使用吗?

使用双指针解决问题是利用双指针的不回退降低遍历数组的时间复杂度 ,其要依赖窗口信息的单调性来实现

本题数组元素包含0和负数,导致求和(窗口信息)不具有单调性了!

我们思考能否由我们自己塑造单调性呢,显然做不到,目前我们塑造单调性,只使用过排序,然而排序并不能解决求和的单调性问题

双指针的思路只能放弃

对于数组求和,我们还接接触过一种算法:前缀和

前缀和

用前缀和,就别管那么多了,直接在数组前n项和的变式上,摸索摸索

如图:我们将数组抽象成一个线条方便画图

画完发现像个嘴唇

上图中,是对于数组中随机的一个符合条件的子数组进行的分析

图中子数组的右区间是 i

我们发现子数组和为k,那么它前边的区间部分的和,必然是sum[ i ]-k

核心思想

那么我们就可以推出,对于数组的前i项,其前缀和数组中存在值为sum[ i ]-k的话,必然存在一个子数组,它的和为k

我们要统计和为k的子数组的个数,即统计i之前的数组的前缀和为sum[i]-k的个数,使用hash表即可,统计完之后,把它累加给ret即可

细节
  • 不可以也没必要一次性把所有的前缀和全部算出来,因为在i之后,有新的元素的加入,可能还会有满足前缀和为sum[i]-k的位置出现,比如i+1的位置为-1,i+2的位置为1。sum[i+2]-k等于sum[i]-k,但是它的位置就不对了,没有对应的和为k的子数组,但是我们统计的标准是统计前缀和为sum[i]-k,hash会把它统计到,属于无效统计。
  • 在前i-1个位置的前缀和中汇总数组的前缀和为sum[i]-k的个数,然后再把sum[i]加入到哈希表中,这是为了防止k=0时的误判,若k=0,先将sum[i]加入到哈希表,不管是否有和为0的子数组,sum[i]必然满足与sum[i]-k相等的条件,这样我们的判断标准就失灵了。
  • 如果sum[i]本身就为k,那么sum[i]-k等于0,那么sum[i]也是满足条件的,但是我们hash只统计前i-1个位置,所以在开始之前,hash[0]的值就应该是1。

代码逻辑:

  • 初始化hash[0]=1,ret

— 进入循环,遍历数组

  • 求i位置的前缀和
  • 汇总符合条件的数组个数
  • 将i位置的前缀和统计到hash

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

和可被 K 整除的子数组

6.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦

在这里插入图片描述


佬的支持就是我前进的最大动力~

期待与佬的再次相遇~

Read more

已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案

已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案

出现cannot find a valid baseurl for repo:base/7/x86_64错误通常是由于YUM仓库源无法找到或无法访问,导致YUM无法正常工作。这种情况常见于CentOS 7系统。解决这个问题需要检查几个方面,如网络连接、DNS设置和YUM仓库源配置。 🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。ZEEKLOG优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk) 💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,

By Ne0inhk
从云原生部署到智能时序分析:基于 Kubernetes 的 Apache IoTDB 集群实战与 TimechoDB 国产化增强特性深度解析

从云原生部署到智能时序分析:基于 Kubernetes 的 Apache IoTDB 集群实战与 TimechoDB 国产化增强特性深度解析

从云原生部署到智能时序分析:基于 Kubernetes 的 Apache IoTDB 集群实战与 TimechoDB 国产化增强特性深度解析 前言 随着物联网设备规模的指数级增长,传感器产生的海量时序数据对传统数据库的性能、可扩展性与成本控制提出了更高要求。Apache IoTDB 作为专为物联网场景设计的时序数据库,凭借高压缩比、百万级写入能力及毫秒级查询性能,成为物联网数据存储与分析的核心基础。本文将从 IoTDB 的核心特性 出发,深入讲解其在 Kubernetes 环境中的部署实践、CRUD 操作示例,并延伸至 TimechoDB 的国产化增强能力,帮助读者全面掌握从单节点到云原生集群的 IoTDB 实战部署与应用方法,为构建高效、可扩展的时序数据平台提供系统参考。 Apache IoTDB 核心特性与价值 Apache IoTDB 专为物联网场景打造的高性能轻量级时序数据库,以 “设备 - 测点” 原生数据模型贴合物理设备与传感器关系,通过高压缩算法、百万级并发写入能力和毫秒级查询响应优化海量时序数据存储成本与处理效率,同时支持边缘轻量部署、

By Ne0inhk

Docker 零基础入门:一篇搞懂 Docker 是什么、为什么要用它

适合人群:纯新手、没接触过容器、只想先搞懂 Docker 核心概念的同学文章定位:不讲底层原理、不写复杂命令,只说清楚「Docker 是干啥的」「为什么项目离不开它」 一、前言:先说说你一定会遇到的痛点 做开发 / 运维的朋友,大概率都听过这句话:「在我电脑上跑的好好的,怎么到服务器上就报错了?」 * 开发用 Windows,测试用 Mac,生产用 Linux,环境不一样 * 项目依赖的 JDK、Python、MySQL、Nginx 版本不统一 * 装一个软件要配一堆环境,换台机器就得重来一遍 * 多个项目依赖冲突,改一个崩另一个 这些问题,Docker 就是专门来解决的。 二、Docker 到底是什么?(大白话版) 1. 最通俗的比喻:Docker = 「软件集装箱」 你可以把服务器看成一艘大货轮,应用

By Ne0inhk
【Linux指南】进程控制系列(五)实战 —— 微型 Shell 命令行解释器实现

【Linux指南】进程控制系列(五)实战 —— 微型 Shell 命令行解释器实现

前面四篇文章,我们已经掌握了进程控制的 “全链路技能”:用fork创建子进程、exec替换程序、waitpid回收资源、exit终止进程。今天,我们将这些知识 “组装” 成一个能实际运行的工具 ——微型 Shell 命令行解释器(简称 “迷你 Shell”)。 这个迷你 Shell 将支持:命令行提示符(如[user@host dir]#)、内建命令(cd/export/env/echo)、外部命令(ls/ps等)、环境变量管理(继承与导出),完全遵循 Linux Shell 的核心工作逻辑。通过亲手实现,你会彻底明白 “输入一条命令后,Shell 到底在做什么”。 一、先搞懂:Shell 的本质是 “命令管家” 在写代码前,

By Ne0inhk