Bomb Enemy

非常明显的记忆化搜索,核心问题只有一个:

  • 给定一行/列,如何最高效地计算出每个位置在当前 行/列 上能炸到的最大值。

跑了个简单 Case,结论是,雷可以穿人。和炸弹人差不多。。。

这个题写了两遍还是没能一次写出来, 一次没有分析到正确的点上, 写出来的代码不简洁, 正确的分析方式是

  • rowCache在第一列(j=0)或W的时候更新

  • colCache在第一行(i=0)或W的时候更新

  • 剩下情况, 只要"吃老本", 用计算好的rowCache和colCache更新结果就可以.

  • 考虑到循环是 row , col 的顺序,我们的 rowCache 一个变量就够了,但是 colCache 得存个数组才行。

public int maxKilledEnemies(char[][] grid) {
        if(grid == null || grid.length == 0) return 0;
        int rows = grid.length;
        int cols = grid[0].length;

        int max = 0;
        int rowCache = 0;
        int[] colCache = new int[cols];

        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                if(j == 0 || grid[i][j - 1] == 'W'){
                    rowCache = 0;
                    for(int k = j; k < cols && grid[i][k] != 'W'; k++){
                        rowCache += grid[i][k] == 'E' ? 1 : 0;
                    }
                }

                if(i == 0 || grid[i - 1][j] == 'W'){
                    colCache[j] = 0;
                    for(int k = i; k < rows && grid[k][j] != 'W'; k++){
                        colCache[j] += grid[k][j] == 'E' ? 1 : 0;
                    }
                }

                if(grid[i][j] == '0') max = Math.max(max, rowCache + colCache[j]);
            }
        }

        return max;
    }

results matching ""

    No results matching ""