题目地址:
https://leetcode.com/problems/bomb-enemy/
给定一个二维矩阵 A A A,每个位置是 0 0 0, W W W, E E E三者其一, 0 0 0代表空地, W W W代表墙, E E E代表敌人。只允许在空地上放一枚炸弹,它可以沿着四个方向炸死沿途的敌人,但是遇到墙则会停止。问炸弹放在哪儿能炸死最多的敌人。
参考https://blog.csdn.net/qq_46105170/article/details/108596792。代码如下:
public class Solution {
public int maxKilledEnemies(char[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int m = grid.length, n = grid[0].length;
int[][] up = new int[m][n], down = new int[m][n], left = new int[m][n], right = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 'W') {
up[i][j] = 0;
} else {
if (grid[i][j] == 'E') {
up[i][j] = 1;
}
if (i > 0) {
up[i][j] += up[i - 1][j];
}
}
}
}
for (int i = m - 1; i >= 0; i--) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 'W') {
down[i][j] = 0;
} else {
if (grid[i][j] == 'E') {
down[i][j] = 1;
}
if (i < m - 1) {
down[i][j] += down[i + 1][j];
}
}
}
}
for (int j = 0; j < n; j++) {
for (int i = 0; i < m; i++) {
if (grid[i][j] == 'W') {
left[i][j] = 0;
} else {
if (grid[i][j] == 'E') {
left[i][j] = 1;
}
if (j > 0) {
left[i][j] += left[i][j - 1];
}
}
}
}
for (int j = n - 1; j >= 0; j--) {
for (int i = 0; i < m; i++) {
if (grid[i][j] == 'W') {
right[i][j] = 0;
} else {
if (grid[i][j] == 'E') {
right[i][j] = 1;
}
if (j < n - 1) {
right[i][j] += right[i][j + 1];
}
}
}
}
int res = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 'W' || grid[i][j] == 'E') {
continue;
}
res = Math.max(res, up[i][j] + down[i][j] + left[i][j] + right[i][j]);
}
}
return res;
}
}
时空复杂度 O ( m n ) O(mn) O(mn)。