class Solution { public int numSubmatrixSumTarget(int[][] matrix, int target) { int xLength = matrix.length; int yLength = matrix[0].length; int[][] sum = new int[xLength + 1][yLength + 1]; Map map = new HashMap<>(); int count = 0; for (int i = 1; i < xLength + 1; i++) { for (int j = 1; j < yLength + 1; j++) { sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]; if (matrix[i - 1][j - 1] == target) { count++; } map.put(sum[i][j], map.getOrDefault(sum[i][j], 0)); } } for (int key : map.keySet()) { int value = map.get(key); if (key == 2 * target && value > 1) { count += value * (value - 1) / 2; } else if (key > target && map.containsKey(key - target)) { count += value * map.get(key - target); } } return count; } } //total_testcases:40 //total_correct:3 //input_formatted:[[1,-1],[-1,1]] 0 //expected_output:5 //code_output:0