/**
* https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf
*
* 本题采用前缀和的思想(用来快速的得到数组某一段区间里的值的和)
* 首先录入数组arr
* 创建一个dp数组用来存放数组的前缀和
* dp[i]就表示arr数组[0,i]里面的值的和
* dp[i]里面的i从一开始计数
* 使用dp[i]=dp[i-1]+arr[i]接口快速的到数据
* 需要算出arr数组[l,r]区间的值
* 就可以使用dp[r]-dp[l-1]的值来输出
* 此时需要注意,dp[i]的i需要从1开始,原因时因为当计算arr数组中[0,2]的值时
* 从0开始的画会造成dp[2]-dp[-1]造成数据的越界访问,因此将dp[0]的值置成0即可不影响数据
* */
public static void hanShu1(){
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--;
}
}
/**
* https://www.nowcoder.com/practice/99eb8040d116414ea3296467ce81cbbc
* 详情看图
* */
public static void hanShu2(){
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
int 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];
dp[0][0]=0;
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();
int y1=in.nextInt();
int x2=in.nextInt();
int y2=in.nextInt();
long result=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
System.out.println(result);
q--;
}
}
![]()
/**
* https://leetcode.cn/problems/find-pivot-index/
* 见图
* */
public static void hanShu3(int[] nums){
int n=nums.length;
int[] f=new int[n];
int[] g=new int[n];
f[0]=g[n-1]=0;
for (int i = 1; i < n; i++) {
f[i]=f[i-1]+nums[i-1];
}
for(int j=n-2;j>=0;j--){
g[j]=g[j+1]+nums[j+1];
}
for (int i = 0; i < n; i++) {
if (f[i]==g[i]){
System.out.println("ok->"+i);
return;
}
}
}
![]()
/**
* https://leetcode.cn/problems/product-of-array-except-self/
* 见图
* */
public static void hanShu4(int[] nums){
int n=nums.length;
long[] f=new long[n];
long[] g=new long[n];
long[] arr=new long[n];
f[0]=g[n-1]=1;
for (int i = 1; i < n; i++) {
f[i]=f[i-1]*nums[i-1];
}
for(int j=n-2;j>=0;j--){
g[j]=g[j+1]*nums[j+1];
}
for (int i = 0; i < n; i++) {
arr[i]=f[i]*g[i];
}
}