coding ability 展开第七幕(前缀和算法——进阶巩固)超详细!!!!

coding ability 展开第七幕(前缀和算法——进阶巩固)超详细!!!!
在这里插入图片描述

文章目录

前言

本专栏上篇博客带大家了解了前缀和的有关模版以及习题的训练
从一维到二维的拓展,今天我们继续来练习一下前缀和的有关算法
fellow me

和为k的子数组

在这里插入图片描述

思路

在这里插入图片描述


设 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 。因此,我们仅需用一个哈希表,一边求当前位置的前缀和一边存下之前每一种前缀和出现的次数。

前缀和和哈希结合起来还是很巧妙的

classSolution{public:intsubarraySum(vector<int>& nums,int k){ unordered_map<int,int> hash; hash[0]=1;int sum =0, ans =0;for(auto x : nums){ sum += x;if(hash.count(sum - k))// 判断前面的区间有没有 sum - k{// 如果有 前面区间到当前位置就满足条件 ans += hash[sum - k];} hash[sum]++;}return ans;}};

和可被k整除的子数组

在这里插入图片描述

思路

乍一看,好像和上一题差不多,但是又好像有点不同,来处理一下这个整除k吧,把问题转换到上一题
同余定理:
如果 (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
这些处理完之后,剩下的就和前面的那个题目一样啦

classSolution{public:intsubarraysDivByK(vector<int>& nums,int k){int sum =0, ans =0; unordered_map<int,int> hash; hash[0% k]=1;// 注意不要遗忘 0 这个情况for(auto x : nums){ sum += x;// 算出当前的前缀和int ret =(sum % k + k)% k;// 修正后的余数if(hash.count(ret)) ans += hash[ret];// 统计结果  hash[ret]++;}return ans;}};

连续数组

在这里插入图片描述

思路

稍微转化一下题目,把 0 都看成 -1 ,这样就变成 和为 0 的最大长度的子数组
稍微处理一下细节就好啦

classSolution{public:intfindMaxLength(vector<int>& nums){ unordered_map<int,int> hash;int sum =0, ans =0; hash[0]=-1;// 不要忘记 0 这个情况for(int i =0; i < nums.size(); i++){ sum += nums[i]==0?-1:1;// sum前缀和 if(hash.count(sum)) ans =max(ans, i - hash[sum]);// 判断条件 更新anselse hash[sum]= i;//否则 更新hash }return ans;}};

矩阵区域和

在这里插入图片描述

思路

二维前缀和的简单应用题,关键就是我们在填写结果矩阵的时候,要找到原矩阵对应区域的「左上角」以及「右下角」的坐标
左上角坐标: x1 = i - k,y1 = j - k ,但是由于会**「超过矩阵」的范围**,因此需要对 0取一个 max
因此修正后的坐标为: x1 = max(0, i - k), y1 = max(0, j - k)
右下角坐标: x1 = i + k,y1 = j + k ,但是由于会「超过矩阵」的范围,因此需要对 m- 1 ,以及 n - 1 取一个 min
因此修正后的坐标为:x2 = min(m - 1, i + k), y2 = min(n - 1, j + k)
主要就是处理边界问题,以及预处理前缀和后的下标映射问题

classSolution{public: vector<vector<int>>matrixBlockSum(vector<vector<int>>& mat,int k){int n = mat.size(), m = mat[0].size(); vector<vector<int>>dp(n +1, vector<int>(m +1));for(int i =1; i <= n; i++)// 预处理{for(int j =1; j <= m; j++){ dp[i][j]= dp[i -1][j]+ dp[i][j -1]- dp[i -1][j -1]+ mat[i -1][j -1];}} vector<vector<int>>ans(n, vector<int>(m));// answer 数组 for(int i =0; i < n; i++){for(int j =0; j < m; j++){int x1 =max(0, i - k)+1, y1 =max(0, j - k)+1;// 注意下标映射到 dp数组int x2 =min(n -1, i + k)+1, y2 =min(m -1, j + k)+1; ans[i][j]= dp[x2][y2]- dp[x1 -1][y2]- dp[x2][y1 -1]+ dp[x1 -1][y1 -1];}}return ans;}};

总结

总结

前缀和算法通过预处理数组,将区间和查询优化为常数时间,是处理子数组问题的利器。其核心在于利用哈希表动态记录前缀和及其出现次数,将问题转化为查找特定差值或余数,从而高效统计满足条件的子数组。

一维数组中,通过同余定理转换问题(如将整除转化为余数相等)、将元素转换为±1求平衡子数组,展现了前缀和的灵活运用。处理负数取模时,需修正余数保证非负。

对于二维前缀和,需注意矩阵边界的截断处理,通过坐标映射与容斥原理快速计算区域和。

总之,前缀和与哈希表结合,能有效解决多种子数组统计问题,关键在于问题转化与边界处理,提升算法效率的同时降低复杂度。

今天的内容就到这里啦,不要走开,小编持续更新中~~~~
在这里插入图片描述

Read more

TeslaMate完全指南:从安装到数据可视化的开源特斯拉监控方案

TeslaMate完全指南:从安装到数据可视化的开源特斯拉监控方案 【免费下载链接】teslamateteslamate-org/teslamate: TeslaMate 是一个开源项目,用于收集特斯拉电动汽车的实时数据,并存储在数据库中以便进一步分析和可视化。该项目支持监控车辆状态、行驶里程、充电详情等信息。 项目地址: https://gitcode.com/gh_mirrors/te/teslamate 你还在为特斯拉车辆数据分散、分析困难而烦恼吗?TeslaMate作为一款开源的特斯拉数据监控工具,能够帮助你轻松收集、存储和可视化车辆的实时数据,包括行驶里程、充电详情、电池健康状态等关键信息。本文将从安装部署到数据应用,为你提供一套完整的特斯拉数据管理解决方案,让你全面掌握车辆状态,优化驾驶体验。 一、TeslaMate简介 TeslaMate是一个开源项目,用于收集特斯拉电动汽车的实时数据,并存储在数据库中以便进一步分析和可视化。该项目支持监控车辆状态、行驶里程、充电详情等信息,帮助车主更好地了解车辆使用情况,优化充电策略,延长电池寿命。 TeslaMate的核心

By Ne0inhk

本地部署 OpenClaw:让 AI 真正“干活”的开源智能体,从核心概念到实战全流程

本地部署 OpenClaw:让 AI 真正“干活”的开源智能体,从核心概念到实战全流程 这里写目录标题 * 本地部署 OpenClaw:让 AI 真正“干活”的开源智能体,从核心概念到实战全流程 * 一、核心概念:读懂 OpenClaw 与 Skills * 1. OpenClaw:本地优先的自主 AI 内核 * 2. Skills:AI 助手的“功能插件库” * (1)Skills 核心构成 * (2)加载路径与优先级 * (3)必装核心 Skills * 二、前置准备:部署前必做的 3 件事 * 1. 系统与硬件要求 * 2. 强制依赖安装

By Ne0inhk
小型服务器监控太复杂?DashDot+cpolar轻量方案新手也能上手!

小型服务器监控太复杂?DashDot+cpolar轻量方案新手也能上手!

文章目录 * 前言 * 1. 本地环境检查 * 1.1 安装docker * 1.2 下载Dashdot镜像 * 2. 部署DashDot应用 * 3. 本地访问DashDot服务 * 4. 安装cpolar内网穿透 * 5. 固定DashDot公网地址 前言 家里放了台小服务器跑服务,想看看CPU和内存占用,还得SSH登录输命令?太麻烦了!DashDot这款轻量级监控工具帮你搞定,网页版仪表盘直观显示服务器状态,颜值还超高✨。但问题来了,只能在同一网络查看,出门在外想看看服务器是否正常运行都不行?别慌,cpolar内网穿透来帮忙,让你的服务器仪表盘“随身带”,监控从此告别“命令行依赖”! DashDot的核心功能就像给服务器装了“智能后视镜”,CPU、内存、磁盘、网络使用情况实时显示,还有漂亮的动态图表,连风扇转速都能监控到。它特别适合个人开发者和小型服务器用户,尤其是非专业运维的朋友,毕竟部署只要一条Docker命令,连我这种“技术小白”都能搞定。优点嘛,

By Ne0inhk
OpenAI 开源模型 gpt-oss 本地部署详细教程

OpenAI 开源模型 gpt-oss 本地部署详细教程

OpenAI 最近发布了其首个开源的开放权重模型gpt-oss,这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说,这意味着我们终于可以在自己的机器上,完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows和Linux系统上,借助极其便捷的本地大模型运行框架Ollama,轻松部署和使用 gpt-oss 模型。 一、准备工作:系统配置与性能预期 在开始之前,了解运行环境非常重要。本次部署将在我的个人电脑上进行,下面是推荐配置: * CPU: 现代多核 CPU,如 Intel Core i7 或 AMD Ryzen 7 系列 * 内存 (RAM): 32 GB 或更多 * 显卡 (GPU): 强烈推荐 NVIDIA GeForce RTX 4090 (24 GB 显存)。这是确保大型模型流畅运行与高效微调的理想选择。 * 操作系统: Linux 或 Windows

By Ne0inhk