[Algorithm][前缀和][模板 一维前缀和][模板 二维前缀和][寻找数组中心下标][除自身以外数组的乘积] + 前缀和原理 + 前缀和模板

目录

  • 0.原理讲解
  • 1.[模板]一维前缀和
    • 1.题目链接
    • 2.模板代码实现
  • 2.[模板]二维前缀和
    • 1.题目链接
    • 2.算法原理讲解
    • 3.模板代码实现
  • 3.寻找数组的中心下标
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 4.除自身以外数组的乘积
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


0.原理讲解

  • 前缀和:快速求出数组中某一个连续区间的和

  • 一维前缀和步骤:

    1. 预处理出来一个前缀和数组

      • dp[i]表示:[1, i]区间内所有元素的和
      • 状态方程转移dp[i] = dp[i - 1] + arr[i]
        请添加图片描述
    2. 使用前缀和数组

      • [l, r] -> dp[r] - dp[l - 1]
        请添加图片描述
  • 二维前缀和步骤:

    1. 预处理出来一个前缀和数组

      • dp[i][j]表示:从[1, 1]位置到[i, j]位置,这段区间里面所有元素的和
      • 状态方程转移dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1]
        请添加图片描述
    2. 使用前缀和数组

      • [ x 1 , y 1 ] − [ x 2 , y 2 ] [x_1, y_1] - [x_2, y_2] [x1,y1][x2,y2] -> D = d p [ x 2 ] [ y 2 ] − d p [ x 1 − 1 ] [ y 2 ] − d p [ x 2 ] [ y 1 − 1 ] + d p [ x 1 − 1 ] [ y 1 − 1 ] D = dp[x_2][y_2] - dp[x_1 - 1][y_2] - dp[x_2][y_1 - 1] + dp[x_1 - 1][y_1 -1] D=dp[x2][y2]dp[x11][y2]dp[x2][y11]+dp[x11][y11]
        请添加图片描述
  • 为什么下标要从1开始计数?

    • 为了处理边界情况
      • 倘若l == 0,那么使用前缀和数组时就会出现dp[r] - dp[-1]
      • 但此时若从1开始计数,则为dp[2] - dp[0],此时不会出现任何问题
    • arr[0] = 0是不会影响其他值的

1.[模板]一维前缀和

1.题目链接

  • [模板]一维前缀和

2.模板代码实现

int main()
{int n = 0, q = 0;cin >> n >> q;vector<int> arr(n + 1);for(int i = 1; i <= n; i++){cin >> arr[i];}// 预处理出来一个前缀和数组vector<long long> dp(n + 1);for(int i = 1; i <= n; i++){dp[i] = dp[i - 1] + arr[i];}// 使用前缀和数组int l = 0, r = 0;while(q--){cin >> l >> r;cout << dp[r] - dp[l - 1] << endl;}return 0;
}

2.[模板]二维前缀和

1.题目链接

  • [模板]二维前缀和

2.算法原理讲解

  • 类⽐于⼀维数组的形式,如果能处理出来从[1, 1]位置到[i, j]位置这⽚区域内所有元素的累加和,就可以在 O ( 1 ) O(1) O(1)的时间内,搞定矩阵内任意区域内所有元素的累加和

3.模板代码实现

int main()
{int n = 0, m = 0, q = 0;cin >> n >> m >> q;// 读取数据vector<vector<int>> arr(n + 1, vector<int>(m + 1));for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin >> arr[i][j];}}// 预处理前缀和矩阵vector<vector<long long>> dp(n + 1, vector<long long>(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] + arr[i][j] - dp[i - 1][j - 1];}}// 使用预处理数组int x1 = 0, y1 = 0, x2 = 0, y2 = 0;long long ret = 0;while(q--){cin >> x1 >> y1 >> x2 >> y2;ret = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];cout << ret << endl;;}return 0;
}

3.寻找数组的中心下标

1.题目链接

  • 寻找数组的中心下标

2.算法原理详解

  • 由本题可感受出:前缀和类型的题不要硬套模板,题目问什么,根据题目,去微调模板就可以
    • 比如[0, i - 1]中的最大值,也可以用前缀和思想
  • 从中⼼下标的定义可知,除中⼼下标的元素外,该元素左边的**「前缀和」等于该元素右边的「后缀和」**
    • 因此,可以先预处理出来两个数组,⼀个表⽰前缀和,另⼀个表⽰后缀和
    • 然后,可以循环枚举可能的中⼼下标,判断每⼀个位置的「前缀和」以及 「后缀和」,如果⼆者相等,就返回当前下标
  • 前缀和数组f[i]表示:[0, i - 1]区间,所有元素的和
    • 状态转移方程f[i] = f[i - 1] + nums[i - 1]
  • 后缀和数组g[i]表示:[i + 1, n - 1]区间,所有元素的和
    • 状态转移方程g[i] = g[i + 1] + nums[i + 1]
  • 细节处理
    • f[0] = 0g[n - 1] = 0
    • f -> 从左向右 / g -> 从右向左
      请添加图片描述

3.代码实现

int PivotIndex(vector<int>& nums) 
{int n = nums.size();vector<int> f(n), g(n);// 预处理前缀和数组和后缀和数组// f[i] -> [0, i - 1]区间,所有元素的和for(int i = 1; i < n; i++){f[i] = f[i - 1] + nums[i - 1];}// g[i] -> [i + 1, n - 1]区间,所有元素的和for(int i = n - 2; i >= 0; i--){g[i] = g[i + 1] + nums[i + 1];}// 使用 前缀和 && 后缀和 数组for(int i = 0; i < n; i++){if(f[i] == g[i]){return i;}}return -1;
}

4.除自身以外数组的乘积

1.题目链接

  • 除自身以外数组的乘积

2.算法原理详解

  • 前缀积数组f[i]表示:[0, i - 1]区间,所有元素的乘积
    • 状态转移方程f[i] = f[i - 1] * nums[i - 1]
  • 后缀积数组g[i]表示:[i + 1, n - 1]区间,所有元素的乘积
    • 状态转移方程g[i] = g[i + 1] * nums[i + 1]
  • 细节处理
    • f[0] = 1,g[n - 1] = 1`
    • f -> 从左向右 / g -> 从右向左
      请添加图片描述

3.代码实现

vector<int> productExceptSelf(vector<int>& nums) 
{int n = nums.size();vector<int> f(n), g(n);f[0] = 1, g[n - 1] = 1; // 细节处理// 预处理前缀积数组和后缀积数组for(int i = 1; i < n; i++){f[i] = f[i - 1] * nums[i - 1];}for(int i = n - 2; i >= 0; i--){g[i] = g[i + 1] * nums[i + 1];}// 使用vector<int> ret(n);for(int i = 0; i < n; i++){ret[i] = f[i] * g[i];}return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/643720.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(ICML-2021)从自然语言监督中学习可迁移的视觉模型

从自然语言监督中学习可迁移的视觉模型 Title&#xff1a;Learning Transferable Visual Models From Natural Language Supervision paper是OpenAI发表在ICML 21的工作 paper链接 Abstract SOTA计算机视觉系统经过训练可以预测一组固定的预定目标类别。这种受限的监督形式限制…

数新大数据平台迁移解决方案

随着企业的发展和数字化转型的不断深入&#xff0c;企业数据平台建设过去很多年&#xff0c;技术和架构过于落后&#xff0c;原有的大数据平台越来越难以满足业务需求。而在新的技术架构大数据平台的升级过程中&#xff0c;对数据和任务迁移的一致性、完整性有很高的要求&#…

P1106 删数问题

本题为洛谷&#xff1a; #include<iostream> #include<string> using namespace std; int main(){string n;int k;cin>>n>>k;while(k--){for(int i0;i<n.length();i){if(n[i]>n[i1]){n.erase(i,1); break;} }for(int i0;i<n.length()-1&&…

DeepFaceLab小白教程:视频换脸过程

合适那些人阅读&#xff1f; 适合从未使用过DeepFaceLab的群体。 如果你想基于DeepFaceLab完成一次视频换脸的操作&#xff0c;可以看本篇。 下载方式 GitHub https://github.com/iperov/DeepFaceLab 我是用motrix下载。 网盘 https://pan.baidu.com/share/init?surlO4…

百度GL地图实现选点获取经纬度并且地址逆解析

index.html引入 <script src"https://api.map.baidu.com/api?typewebgl&v1.0&ak你的ak"></script>组件使用 <el-input:disabled"[详情].includes(title)"v-model"formData.site"placeholder""><templat…

vue项目启动npm install和npm run serve时出现错误Failed to resolve loader:node-sass

1.常见问题 问题1&#xff1a;当执行npm run serve时&#xff0c;出现Failed to resolve loader: node-sass&#xff0c;You may need to install it 解决方法&#xff1a; npm install node-sass4.14.1问题2&#xff1a;当执行npm run serve时&#xff0c;出现以下错误 Fa…

【学习】软件测试自动化,是未来的趋势还是当前的必需

在当今快速迭代的软件开发周期中&#xff0c;速度和质量成为了企业生存的关键。随着DevOps实践的普及和持续集成/持续部署&#xff08;CI/CD&#xff09;流程的标准化&#xff0c;软件测试自动化已经从未来的趋势转变为当前的必要性。本文将探讨自动化测试的现状、必要性以及其…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…

JAVASE基础语法(异常、常用类)

一、异常 1.1 什么是异常 异常就是指不正常。是指代码在运行过程中可能发生错误&#xff0c;导致程序无法正常运行。 package com.atguigu.exception;public class TestException {public static void main(String[] args) {int[] arr {1,2,3,4,5};System.out.println(&quo…

iOS - 多线程的安全隐患

文章目录 iOS - 多线程的安全隐患1. 卖票案例2. 多线程安全隐患的解决方案2.1 iOS中的线程同步方案2.2 同步方案的使用2.2.1 OSSpinLock2.2.1.1 使用方法&#xff1a;2.2.1.2 案例 2.2.2 os_unfair_lock2.2.2.1 使用方法&#xff1a;2.2.2.2 案例 2.2.3 pthread_mutex2.2.3.1 使…

OceanBase诊断调优 】—— 如何快速定位SQL问题

作者简介&#xff1a; 花名&#xff1a;洪波&#xff0c;OceanBase 数据库解决方案架构师&#xff0c;目前负责 OceanBase 数据库在各大型互联网公司及企事业单位的落地与技术指导&#xff0c;曾就职于互联网大厂和金融科技公司&#xff0c;主导过多项数据库升级、迁移、国产化…

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 查看报错信息 根据报错信息进行修改 3. 配置服务器添加节点时…