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

优选算法——前缀和

目录

1. 数组的中心下标

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

3. 和为k的子数组 

4. 和可被K整除的子数组

5. 连续数组

6. 矩阵区域和 


1. 数组的中心下标

题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode)

题目展示:

题目分析:

这里的思想类似于动态规划,我们需要定义出两个状态表示。 

代码实现:

class Solution {
public:int pivotIndex(vector<int>& nums) {int n=nums.size();vector<int> f(n);auto g=f;f[0]=0;g[n-1]=0;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];}for(int i=0;i<n;i++){if(f[i]==g[i]) return i;}return -1;}
};

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

题目链接:238. 除自身以外数组的乘积 - 力扣(LeetCode)

题目展示:


 

题目分析:

这里需要强调一点,大家不要去死记硬背前缀和的模板,而是要去理解这种思想;比如本题,其实是前缀积,但是本质上和前缀和的思想是一样的。 

代码实现:

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n=nums.size();vector<int> ret(n);vector<int> f(n);auto g=f;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];}for(int i=0;i<n;i++){ret[i]=f[i]*g[i];}return ret;}
};

3. 和为k的子数组 

题目链接:560. 和为 K 的子数组 - 力扣(LeetCode)

题目展示:

题目分析:


代码实现:

class Solution {
public:int subarraySum(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;}
};

4. 和可被K整除的子数组

题目链接:974. 和可被 K 整除的子数组 - 力扣(LeetCode)

题目展示:

题目分析:

与上题很类似,但是需要一些补充知识;

代码实现:

class Solution {
public:int subarraysDivByK(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;}
};

5. 连续数组

题目链接:525. 连续数组 - 力扣(LeetCode)

题目展示:


题目分析:


代码实现:

class Solution {
public:int findMaxLength(vector<int>& nums) {unordered_map<int,int> hash;hash[0]=-1;int sum=0,ret=0;for(int i=0;i<nums.size();i++){sum+=nums[i]==0?-1:1;if(hash.count(sum)) ret=max(ret,i-hash[sum]);else hash[sum]=i;}return ret;}
};

6. 矩阵区域和 

题目链接:1314. 矩阵区域和 - 力扣(LeetCode)

题目展示:

题目分析:

代码实现:

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m=mat.size();int n=mat[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1));for(int i=1;i<=m;i++){for(int j=1;j<=n;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>> ret(m,vector<int>(n));for(int i=0;i<m;i++){for(int j=0;j<n;j++){int x1=max(0,i-k)+1;int y1=max(0,j-k)+1;int x2=min(m-1,i+k)+1;int y2=min(n-1,j+k)+1;ret[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];}}return ret;}
};

相关文章:

  • springCloud/Alibaba常用中间件之Nacos服务注册与发现
  • PyTorch API 10 - benchmark、data、批处理、命名张量
  • 1.stm32使用SSD1322 驱动3.12寸OLED
  • 101alpha第九
  • 第21天打卡
  • 关于Spring
  • 服务器综合实验(实战详解)
  • Vue插槽(Slots)详解
  • 51单片机入门教程——AT24C02数据存储
  • 数据库故障排查全攻略:从实战案例到体系化解决方案
  • 傅利叶十周年,升级核心战略:“有温度”的具身智能蓝图
  • 强化学习系列:深度强化学习和DQN
  • golang常用库之-protojson 库(json.Marshal 和 protojson.Marshal 序列化对比)
  • 【Linux学习笔记】系统文件IO之重定向原理分析
  • IOC和Bean
  • 1 2 3 4 5顺序插入,形成一个红黑树
  • 区块链技术中的Java SE实战:从企业级应用到5大核心问题解析
  • R 语言科研绘图 --- 桑基图-汇总
  • Kubernetes生产实战(十四):Secret高级使用模式与安全实践指南
  • AI Agent(8):安全与伦理考量
  • 宣布停火后,印控克什米尔地区再次传出爆炸声
  • 央行:下阶段将实施好适度宽松的货币政策
  • 代理销售保险存在误导行为,农业银行重庆市分行相关负责人被罚款0.1万元
  • 康子兴评《文明的追求》|野人脚印:鲁滨逊的恐惧与文明焦虑
  • 中俄元首今年首次面对面会谈,达成哪些新的重要共识?
  • 美联储主席:美联储工作方式不会受特朗普影响,从未寻求与总统会面