import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int n = 3, m = 4;
int[][] ji = new int[][]{
{1,5,6,8},
{9,6,7,3},
{5,3,2,4}
};
int[][] a = new int[n + 1][m + 1];
int[][] b = new int[n + 2][m + 2];
//对原有数组进行扩大
for (int i = 1; i < a.length; i++)
for (int k = 1; k < a[0].length; k++)
a[i][k] = ji[i - 1][k - 1];
//进行前缀和运算
int[][] at = new int[n + 1][m + 1];
for (int i = 1; i < n + 1; i++)
for (int j = 1; j < m + 1; j++)
at[i][j] = a[i][j] + at[i][j-1] + at[i-1][j] - at[i - 1][j - 1];
for (int[] is : at) System.out.println(Arrays.toString(is));
System.out.println(get_sum(1, 1, 2, 2, at));
System.out.println(get_sum(0, 1, 1, 3, at));
add(2, 2, 3, 3, 2, b);
int[][] bt = new int[n + 1][m + 1];
for (int i = 1; i < n + 1; i++)
for (int j = 1; j < m + 1; j++)
bt[i][j] = b[i][j] + bt[i][j-1] + bt[i-1][j] - bt[i - 1][j - 1];
for (int[] is : b) System.out.println(Arrays.toString(is));
for (int[] is : bt) System.out.println(Arrays.toString(is));
}
//矩阵求和
public static int get_sum(int x1, int y1, int x2, int y2, int[][] a) {
return a[x2 + 1][y2 + 1] - a[x2 + 1][y1 - 1 + 1] - a[x1 - 1 + 1][y2 + 1] + a[x1 - 1 + 1][y1 - 1 + 1];
}
//得到差分数组
public static void add(int x1, int y1, int x2, int y2, int add, int[][] a) {
a[x1][y1] += add;
a[x2 + 1][y1] -= add;
a[x1][y2 + 1] -= add;
a[x2 + 1][y2 + 1] += add;
}
}
JAVA二维前缀和和差分
于 2023-02-25 22:00:45 首次发布