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

算法专题四:前缀和

1.一维前缀和

题目链接:【模板】前缀和_牛客题霸_牛客网

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n =in.nextInt();int q =in.nextInt();int[] arr=new int[n+1];long[] dp=new long[n+1];for(int i=1;i<=n;i++){arr[i]=in.nextInt();}for(int i=1;i<=n;i++){dp[i]=dp[i-1]+arr[i];}while(q>0){int l=in.nextInt();int r=in.nextInt();System.out.println(dp[r]-dp[l-1]);q--;}}
}

2.二维前缀和

题目链接:【模板】二维前缀和_牛客题霸_牛客网

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n=in.nextInt(),m=in.nextInt(),q=in.nextInt();int[][] arr=new int[n+1][m+1];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){arr[i][j]=in.nextInt();}}long[][] dp=new long[n+1][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]+arr[i][j];}}while(q>0){int x1=in.nextInt(),y1=in.nextInt(),x2=in.nextInt(),y2=in.nextInt();System.out.println(dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]);q--;}}
}

3.寻找数组的中心下标

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

class Solution {public int pivotIndex(int[] nums) {int n =nums.length;int[] d=new int[n];int[] b=new int[n];for(int i=1;i<=n-1;i++){d[i]=d[i-1]+nums[i-1];}for(int i=n-2;i>=0;i--){b[i]=b[i+1]+nums[i+1];}for(int i=0;i<n;i++){if(d[i]==b[i]){return i;}}return -1;}
}

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

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

class Solution {public int[] productExceptSelf(int[] nums) {int n=nums.length;int[] d=new int[n];int[] b=new int[n];d[0]=b[n-1]=1;for(int i=1;i<n;i++){d[i]=d[i-1]*nums[i-1];}for(int i=n-2;i>=0;i--){b[i]=b[i+1] * nums[i+1];}int[] ret=new int[n];for(int i=0;i<n;i++){ret[i]=d[i]*b[i];}return ret;}
}

5.和为k的子数组 

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

class Solution {public int subarraySum(int[] nums, int k) {Map<Integer,Integer> hashMap=new HashMap<Integer,Integer>();int ret=0;int sum=0;hashMap.put(0,1);for(int x:nums){sum+=x;ret+=hashMap.getOrDefault(sum-k,0);hashMap.put(sum,hashMap.getOrDefault(sum,0)+1);}return ret;}
}

6.和可被k整除的子数组(☆)

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

首先我们讲解一下什么是同余定理

处理特殊情况

class Solution {public int subarraysDivByK(int[] nums, int k) {Map<Integer,Integer> hash=new HashMap<>();hash.put(0,1);int sum=0,ret=0;for(int x:nums){sum+=x;int r=(sum%k+k)%k;ret+=hash.getOrDefault(r,0);hash.put(r,hash.getOrDefault(r,0)+1);}return ret;}
}

 7.连续数组

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

class Solution {public int findMaxLength(int[] nums) {Map<Integer,Integer> hash=new HashMap<Integer,Integer>();hash.put(0,-1);int sum=0,ret=0;for(int i=0;i<nums.length;i++){sum+=(nums[i]== 0 ? -1 : 1);if(hash.containsKey(sum)){
//如果该前缀和在以前出现过,说明i到以前出现时的下标差 中间的值为零ret=Math.max(ret,i-hash.get(sum));}else{hash.put(sum,i);}}return ret;}
}

8.矩阵区域和

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

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

希望能对大家有所帮助!!!

http://www.xdnf.cn/news/325711.html

相关文章:

  • 【北京迅为】iTOP-4412精英版使用手册-第八章 Android 4.4系统编译
  • neo4j多跳查询,未只获取到收尾两个节点,待继续
  • 智能运维实战|数据库卡慢处置的一次关键事件
  • 尚硅谷-硅谷甄选项目记录
  • Facebook隐私设置详解:如何保护你的个人信息
  • 【漫话机器学习系列】245.权重衰减(Weight Decay)
  • SR触发器为什么能够消抖
  • Vue 项目中长按保存图片功能实现指南
  • AI大模型基础设施:NVIDIA GPU和AMD MI300系列的区别
  • android 记录应用内存
  • Scaffold-DbContext详解
  • 如何减少锁竞争并细化锁粒度以提高 Rust 多线程程序的性能?
  • 2025FIC初赛(手机)
  • JAVA中ArrayList的解析
  • Scala语法
  • 【Axure视频教程】中继器表格——未选、半选和全选
  • 代码随想录算法训练营第五十八天| 图论4—卡码网110. 字符串接龙,105. 有向图的完全联通
  • C# WPF 颜色拾取器
  • MySQL OCP 认证限时免费活动​ 7 月 31 日 前截止!!!
  • 多规格直线运动转换至非线性直线的转换方法
  • 【C++进阶】第1课—继承
  • C#管道通讯及传输信息丢失的原因
  • android中背压问题面试题及高质量回答范例
  • 前端面试测试题目(一)
  • 《Python星球日记》 第49天:特征工程与全流程建模
  • 认识tomcat(了解)
  • Android Studio开发安卓app 设置开机自启
  • RISC-V JTAG:开启MCU 芯片调试之旅
  • 鸿蒙知识总结
  • Promise 高频面试题