publicstaticintlargest1BorderedSquare(int[][] g) { intn= g.length; intm= g[0].length; build(n, m, g); if (sum(g, 0, 0, n - 1, m - 1) == 0) { return0; } // 找到的最大合法正方形的边长 intans=1; for (inta=0; a < n; a++) { for (intb=0; b < m; b++) { // (a,b)所有左上角点 // (c,d)更大边长的右下角点,k是当前尝试的边长 for (intc= a + ans, d = b + ans, k = ans + 1; c < n && d < m; c++, d++, k++) { if (sum(g, a, b, c, d) - sum(g, a + 1, b + 1, c - 1, d - 1) == (k - 1) << 2) { ans = k; } } } } return ans * ans; }
// g : 原始二维数组 // 把g变成原始二维数组的前缀和数组sum,复用自己 // 不能补0行,0列,都是0 publicstaticvoidbuild(int n, int m, int[][] g) { for (inti=0; i < n; i++) { for (intj=0; j < m; j++) { g[i][j] += get(g, i, j - 1) + get(g, i - 1, j) - get(g, i - 1, j - 1); } } }
publicstaticintsum(int[][] g, int a, int b, int c, int d) { return a > c ? 0 : (g[c][d] - get(g, c, b - 1) - get(g, a - 1, d) + get(g, a - 1, b - 1)); }
publicstaticintget(int[][] g, int i, int j) { return (i < 0 || j < 0) ? 0 : g[i][j]; }
二维差分
跟一维差分差不多这里直接给公式
1 2 3 4 5 6 7
// 二维差分 publicstaticvoidadd(int a, int b, int c, int d, int k) { diff[a][b] += k; diff[c + 1][b] -= k; diff[a][d + 1] -= k; diff[c + 1][d + 1] += k; }