合肥網(wǎng)站制作廣東東莞今日最新消息
暴力解法:直接按照題目所示在矩陣的相應(yīng)位置加一
時(shí)間復(fù)雜度:O(n2 * queries.length)
空間復(fù)雜度:O(1)
二維差分:創(chuàng)建二維差分?jǐn)?shù)組,通過(guò)對(duì)差分?jǐn)?shù)組的修改來(lái)影響原來(lái)的數(shù)組,最后還原
時(shí)間復(fù)雜度:O(n2 + queries.length)
空間復(fù)雜度:O(n2)
示例2此種情況會(huì)發(fā)生角標(biāo)越界的情況,因此差分?jǐn)?shù)組需要多初始化2行2列
代碼
import org.junit.Test;public class SubmatrixPlus {@Testpublic void test() {int[][] queries = new int[][]{{1, 1, 2, 2}, {0, 0, 1, 1}};for (int[] query : submatrixPlus(queries, 3)) {for (int n : query) {System.out.print(n + " ");}System.out.println();}int[][] queries1 = new int[][]{{0, 0, 1, 1}};for (int[] query : submatrixPlus(queries1, 2)) {for (int n : query) {System.out.print(n + " ");}System.out.println();}}//int[][] querries = {{左上角行,左上角列,右下角行,右下角列},{左上角行,左上角列,右下角行,右下角列}}public static int[][] submatrixPlus(int[][] queries, int n) {// 構(gòu)建差分?jǐn)?shù)組,多初始化2行2列避免數(shù)組越界int[][] arr = new int[n][n];for (int i = 0; i < queries.length; i++) {arr[queries[i][0] + 1][queries[i][1] + 1]++;//第幾行不等于數(shù)組的索引arr[queries[i][2] + 2][queries[i][1] + 1]--;arr[queries[i][0] + 1][queries[i][3] + 2]--;arr[queries[i][2] + 2][queries[i][3] + 2]++;}//還原數(shù)組int[][] res = new int[n + 2][n + 2];for (int i = 0; i < res.length; i++) {for (int j = 0; j < res[i].length; j++) {arr[i + 1][j + 1] = arr[i + 1][j + 1] + arr[i + 1][j] + arr[i][j + 1] - arr[i][j];res[i][j] = arr[i + 1][j + 1];}}return res;}
}