当前位置: 首页 > article >正文

前缀和(算法4)

1.一维前缀和模板一维前缀和快速求出数组某一连续区间的和一维前缀和模板第一步先预处理出一个数组dp[i] dp[i-1]arr[i]//递推初始化dpdp[i]表示下标为[1, i]的所有数的和第二步[r, l]区间和为dp[r]-dp[l-1]tips:下标从1开始方便处理边界情况添加辅助结点dp使用longlong防溢出模板题codelink:【模板】前缀和_牛客题霸_牛客网2.二维前缀和模板思路同上一维前缀和二维前缀和求所有dp[x][y]的和其中x∈[x1, x2],y∈[y1, y2]二维前缀和模板第一步初始化dp数组dp[i][j]表示所有x∈[1,i], y属于[1,j]和dp[x][y]和dp[i][j] dp[i-1][j] dp[i][j-1] - dp[i-1][j-1] arr[i][j]第二步使用dp解答问题[x1, y1] - [x2, y2] : dp[x2, y2] - dp[x1-1][y2] - dp[x2][y1-1] dp[x1-1][y1-1]tips:dp最好long long防溢出模板题3.寻找数组的中心下标link. - 力扣LeetCode解法一前缀和思路直接套用一维前缀和模板具体见code注释codeclass Solution { public: int pivotIndex(vectorint nums) { //下标从1开始 //求第一个ans使得sum[ans-1] sum[nums.size()] - sum[ans] //return ans-1 nums.insert(nums.begin(), 0); int n nums.size(); vectorint dp(n, 0); //init dp for(int i 1; i n-1; i) { dp[i] dp[i-1] nums[i]; } // use dp for(int ans 1; ans n-1; ans) { if(dp[ans-1] dp[n-1]-dp[ans]) return ans-1; } return -1; } // bool check(int ans){} };解法二前缀和后缀和其实两个方法差不多 都可以4.除自身以外数组的乘机link238. 除自身以外数组的乘积 - 力扣LeetCode思路前缀乘积后缀乘积详见code注释codeclass Solution { public: vectorint productExceptSelf(vectorint nums) { //f[i], t[i]:[0,i], [i,nums.size()-1]前/后缀乘积 //answer f[i-1] * t[i1] int sz nums.size(); vectorint f(sz), t(sz), answer(sz); //init f() t() f[0] nums[0]; for(int i 1; i sz; i) { f[i] f[i-1]*nums[i]; } t[sz-1] nums[sz-1]; for(int i sz-2; i 0; i--) { t[i] t[i1]*nums[i]; } // f() t() - answer[] answer[0] t[1]; answer[sz-1] f[sz-2]; for(int i 1; i sz-1; i) { answer[i] f[i-1]*t[i1]; } return answer; } };5.和为k的子数组link:LCR 010. 和为 K 的子数组 - 力扣LeetCode思路前缀和hash具体见codecode注释codeclass Solution { public: int subarraySum(vectorint nums, int k) { //前缀和 //dp[i]表示nums[0, i]和 //遍历nums对nums[i]求[0, i-1]中的x使dp[x]k-dp[i] vectorint dp(nums.size()); int ans 0; //init dp dp[0] nums[0]; for(int i 1; i nums.size(); i) { dp[i] dp[i-1] nums[i]; } dp.insert(dp.begin(), 0); //dp hash unordered_mapint, int mymap {};//val-cnt for(int i 0; i dp.size(); i) { int target dp[i] - k; ansmymap[target]; mymap[dp[i]]; } return ans; } };优化后代码class Solution { public: int subarraySum(vectorint nums, int k) { //比上一次的优化 // 用int 变量sum取代dp // 初始mymap[0] 1代替dp.insert(dp.begin(), 0) int sum 0, ans 0; unordered_mapint, int mymap {{0, 1}}; for(auto e:nums) { sume; ansmymap[sum-k];//不可用map.count(),因为在非multi中map.count()必定返回1求key对应val应该用mymap.operator[] mymap[sum]; } return ans; } };6.和可被K整除的子数组link:974. 和可被 K 整除的子数组 - 力扣LeetCode思路前缀和hash表tips1.同余定理2.负数%正数C与java中负数%整数负数codeclass Solution { public: int subarraysDivByK(vectorint nums, int k) { //前缀和hash//nums[i] 可能小于等于0不可滑动窗口 //同余定理 //注意C中 负数%正数 负数 // vectorint dpmod(nums.size()); long long dpmod 0, ans 0; unordered_mapint, int mymap; //init dpmod mymap use mymap[0] 1; for(int i 0; i nums.size(); i) { dpmodnums[i]; dpmod (dpmod%k k)%k; ans mymap[dpmod]; mymap[dpmod]; } return ans; } };7.连续数组link525. 连续数组 - 力扣LeetCode思路前缀和 hash具体见codecode注释tip:通过判断cnt0-cnt1是否相等 来判断两点间01数量是否满足关系或0--1, 求和为0的最长连续子数组的最长长度解法一codeclass Solution { public: int findMaxLength(vectorint nums) { //没有单调性不能滑动窗口 //dp0[r]-dp0[l],dp1[r]-dp1[l] dp0[l]-dp1[l]dp0[r]-dp1[r] //使用前缀和求max(r-l) unordered_mapint, int sub_idx;//sub dp0[idx]-dp1[idx];{sub, sub_idx.count(sub)?sub:idx} int dp0 0, dp1 0; int ans 0; // 前缀和 sub_idx[0] -1; for(int i 0; i nums.size(); i) { nums[i]1 ? dp1 : dp0; int sub dp0 - dp1;//sub代表了[0, i]区间内0, 1个数关系 if(sub_idx.count(sub)) {//[0, i], [0, idx]的sub相同则说明区间[i1, idx]满足cnt0 cnt1 int idx sub_idx[sub]; ans max(ans, i - idx); } else { sub_idx[sub] i; } } return ans; } };解法二0--1, 求和为0的最长连续子数组长度8.矩阵区域和link1314. 矩阵区域和 - 力扣LeetCode思路二维前缀和模板codeclass Solution { public: vectorvectorint matrixBlockSum(vectorvectorint mat, int k) { //前缀和 vectorvectorint dp(mat.size(), vector(mat[0].size(), 0)); vectorvectorint ans(mat.size(), vector(mat[0].size(), 0)); //init dp for(int i 0; i mat.size(); i) { for(int j 0; j mat[0].size();j) { dp[i][j] (i-10 ? dp[i-1][j] : 0) (j-10?dp[i][j-1]:0) - ((i-10j-10)?dp[i-1][j-1]:0) mat[i][j]; } } //前缀和 for(int i 0; i ans.size(); i) { for(int j 0; j ans[0].size(); j) { int x1 max(i-k, 0), y1 max(j-k, 0); int x2 min(ik, int(ans.size()-1)), y2 min(jk, int(ans[0].size()-1)); ans[i][j] dp[x2][y2] - (x1-10?dp[x1-1][y2]:0) -(y1-1 0 ?dp[x2][y1-1]:0) (x1-10 y1-10 ? dp[x1-1][y1-1]:0); } } return ans; } };

相关文章:

前缀和(算法4)

1.一维前缀和模板 一维前缀和:快速求出数组某一连续区间的和 一维前缀和模板: 第一步:先预处理出一个数组 dp[i] dp[i-1]arr[i]//递推初始化dp dp[i]表示下标为[1, i]的所有数的和第二步:[r, l]区间和为dp[r]-d…...

简易CPU设计入门:内存读写(二)

专栏导航 上一篇:简易CPU设计入门:内存读写(一) 专栏目录 下一篇:简易CPU设计入门:内存读写(三) 项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c…...

终极 EpubPress 客户端使用指南:解决常见问题的完整方案

终极 EpubPress 客户端使用指南:解决常见问题的完整方案 【免费下载链接】epub-press-clients 📦 Clients for building books with EpubPress. 项目地址: https://gitcode.com/gh_mirrors/ep/epub-press-clients EpubPress 客户端是一款强大的开…...

【项目分享01】轿车信息管理系统(java/sql项目源码+运行过程详解)

轿车信息管理系统 (直接点击上面的链接,即可免费下载文件) 轿车信息管理系统运行过程详解Navicat操作过程:1.打开软件,新建mysql连接2.点击"mysql"选择"新建查询"vs操作过程:1.点击&qu…...

Rust数值编程新纪元:num库完全指南 — 从基础类型到高级数学运算

Rust数值编程新纪元:num库完全指南 — 从基础类型到高级数学运算 【免费下载链接】num A collection of numeric types and traits for Rust. 项目地址: https://gitcode.com/gh_mirrors/nu/num num库是Rust生态中强大的数值编程工具集,提供了丰富…...

html2jade实战教程:处理Mustache/Handlebars模板的最佳实践

html2jade实战教程:处理Mustache/Handlebars模板的最佳实践 【免费下载链接】html2jade Converts HTML to Jade template. Not perfect but useful enough for non-daily conversions. 项目地址: https://gitcode.com/gh_mirrors/ht/html2jade html2jade是一…...

ufbx实战案例:构建自己的3D模型查看器

ufbx实战案例:构建自己的3D模型查看器 【免费下载链接】ufbx Single source file FBX loader 项目地址: https://gitcode.com/gh_mirrors/uf/ufbx ufbx是一个轻量级的单文件FBX加载库,能够帮助开发者轻松读取和解析FBX格式的3D模型文件。本文将通…...

BeetleX ServerBuilder详解:3行代码搭建企业级通信服务

BeetleX ServerBuilder详解:3行代码搭建企业级通信服务 【免费下载链接】BeetleX high performance dotnet core socket tcp communication components, support TLS, HTTP, HTTPS, WebSocket, RPC, Redis protocols, custom protocols and 1M connections problem …...

2026最新AI大模型应用开发的核心技术学习线路看这里

程序员入行AI大模型应用开发必须学算法吗? 答案是不一定!以DeepSeek、Qwq等为代表的大模型已经开源,算法不再是唯一的门槛。那么,大模型应用开发的企业招聘情况如何呢?事实上,大部分企业只有20%的岗位是算法…...

go-mail核心功能全解析:从Client到Msg的完整使用教程

go-mail核心功能全解析:从Client到Msg的完整使用教程 【免费下载链接】go-mail 📧 Easy to use, yet comprehensive library for sending mails with Go 项目地址: https://gitcode.com/gh_mirrors/go/go-mail go-mail是一个功能全面且易于使用的…...

PaddleSpeech模型量化技术终极指南:如何将模型体积减小75%并加速推理

PaddleSpeech模型量化技术终极指南:如何将模型体积减小75%并加速推理 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Ver…...

Scene-Graph-Benchmark.pytorch核心功能揭秘:从目标检测到关系预测的完整流程

Scene-Graph-Benchmark.pytorch核心功能揭秘:从目标检测到关系预测的完整流程 【免费下载链接】Scene-Graph-Benchmark.pytorch A new codebase for popular Scene Graph Generation methods (2020). Visualization & Scene Graph Extraction on custom images/…...

Archon终极国际化指南:如何快速配置多语言界面与本地化支持

Archon终极国际化指南:如何快速配置多语言界面与本地化支持 【免费下载链接】Archon Archon is an AI agent that is able to create other AI agents using an advanced agentic coding workflow and framework knowledge base to unlock a new frontier of automa…...

如何快速构建面向业务的数据应用:Dagster数据产品开发完整指南

如何快速构建面向业务的数据应用:Dagster数据产品开发完整指南 【免费下载链接】dagster Dagster是一个用于构建、部署和监控数据管道的应用程序框架,通过其强大的元编程能力,组织起复杂的数据流水线,确保数据的可靠性和一致性。 …...

零基础Windows用户必备:h2ogpt完全安装指南与配置技巧

零基础Windows用户必备:h2ogpt完全安装指南与配置技巧 【免费下载链接】h2ogpt Private Q&A and summarization of documentsimages or chat with local GPT, 100% private, Apache 2.0. Supports Mixtral, llama.cpp, and more. Demo: https://gpt.h2o.ai/ htt…...

如何高效使用JavaScript代码混淆器:参数处理逻辑与实用指南

如何高效使用JavaScript代码混淆器:参数处理逻辑与实用指南 【免费下载链接】javascript-obfuscator 项目地址: https://gitcode.com/gh_mirrors/ja/javascript-obfuscator JavaScript代码混淆器是保护前端代码安全的重要工具,能够有效防止代码被…...

法律行业革命:10款开源商用LLM让AI法律助手触手可及

法律行业革命:10款开源商用LLM让AI法律助手触手可及 【免费下载链接】open-llms 📋 A list of open LLMs available for commercial use. 项目地址: https://gitcode.com/gh_mirrors/op/open-llms GitHub 加速计划的 open-llms 项目汇集了一系列可…...

Alenka开发者手册:从main.cu入口到算子实现的代码解析

Alenka开发者手册:从main.cu入口到算子实现的代码解析 【免费下载链接】Alenka GPU database engine 项目地址: https://gitcode.com/gh_mirrors/al/Alenka Alenka作为一款GPU数据库引擎,通过高效利用GPU并行计算能力实现数据处理加速。本文将从代…...

如何在移动设备部署MLLM?5分钟快速上手教程

如何在移动设备部署MLLM?5分钟快速上手教程 【免费下载链接】mllm Fast Multimodal LLM on Mobile Devices 项目地址: https://gitcode.com/gh_mirrors/ml/mllm MLLM(Fast Multimodal LLM on Mobile Devices)是一款专为移动设备优化的…...

自托管Esplora教程:提升隐私与安全的本地部署步骤

自托管Esplora教程:提升隐私与安全的本地部署步骤 【免费下载链接】esplora Explorer for Bitcoin and Liquid 项目地址: https://gitcode.com/gh_mirrors/es/esplora Esplora是一款功能强大的Bitcoin和Liquid区块链浏览器,通过自托管部署&#x…...

AppRun开发工具链配置:从Rollup到Jest测试的完整指南

AppRun开发工具链配置:从Rollup到Jest测试的完整指南 【免费下载链接】apprun AppRun is a JavaScript library for developing high-performance and reliable web applications using the elm inspired architecture, events and components. 项目地址: https:/…...

深入Flintlock源码:核心步骤CreateMicroVM的实现原理与最佳实践

深入Flintlock源码:核心步骤CreateMicroVM的实现原理与最佳实践 【免费下载链接】flintlock Lock, Stock, and Two Smoking MicroVMs. Create and manage the lifecycle of MicroVMs backed by containerd. 项目地址: https://gitcode.com/gh_mirrors/fl/flintloc…...

Esplora核心功能解析:交易查询、区块浏览与地址追踪全攻略

Esplora核心功能解析:交易查询、区块浏览与地址追踪全攻略 【免费下载链接】esplora Explorer for Bitcoin and Liquid 项目地址: https://gitcode.com/gh_mirrors/es/esplora Esplora是一款强大的比特币和Liquid区块链浏览器,提供直观的交易查询…...

HiveMQ CE核心功能解析:从MQTT 3.x到5.0的完整支持

HiveMQ CE核心功能解析:从MQTT 3.x到5.0的完整支持 【免费下载链接】hivemq-community-edition HiveMQ CE is a Java-based open source MQTT broker that fully supports MQTT 3.x and MQTT 5. It is the foundation of the HiveMQ Enterprise Connectivity and Me…...

企业微信自动化操作的高效实现方案

核心能力:企业微信RPA自动化 能力介绍 企业微信RPA(Robotic Process Automation) 自动化能力旨在通过 QiWe API 模拟人工操作或直接调用底层协议,实现企业微信内部流程的无人值守处理。它解决了原生 API 权限受限(如无…...

终极SVProgressHUD版本控制指南:从语义化版本到发布策略全解析

终极SVProgressHUD版本控制指南:从语义化版本到发布策略全解析 【免费下载链接】SVProgressHUD 项目地址: https://gitcode.com/gh_mirrors/svp/SVProgressHUD SVProgressHUD作为iOS和tvOS平台上一款简洁易用的进度指示器库,其版本控制策略直接影…...

Subfinder扩展开发终极指南:从零构建高级子域名发现模块

Subfinder扩展开发终极指南:从零构建高级子域名发现模块 【免费下载链接】subfinder 项目地址: https://gitcode.com/gh_mirrors/subf/subfinder Subfinder是一款功能强大的子域名发现工具,能够帮助安全研究人员和开发者快速枚举目标域名下的子域…...

终极Evergreen UI包大小优化指南:如何减少65%的React组件库体积

终极Evergreen UI包大小优化指南:如何减少65%的React组件库体积 【免费下载链接】evergreen 🌲 Evergreen React UI Framework by Segment 项目地址: https://gitcode.com/gh_mirrors/evergreen1/evergreen 在现代前端开发中,React组件…...

终极指南:如何使用Jazzy为CocoaLumberjack生成专业API文档

终极指南:如何使用Jazzy为CocoaLumberjack生成专业API文档 【免费下载链接】CocoaLumberjack 项目地址: https://gitcode.com/gh_mirrors/coc/CocoaLumberjack CocoaLumberjack是iOS和macOS开发中广泛使用的日志框架,提供高效、灵活的日志记录功…...

Win10 将未分配的磁盘空间合并到C盘该怎么做?一文教你3种方法

平时用电脑,下载文件、存视频,或是安装各类软件,要是没特意去设置安装路径和下载路径,这些东西都会默认存到C盘里。用的时间久了,C盘空间就会一点点被占满,电脑运行也会跟着越来越慢、偶尔卡顿。想改善这种…...