JavaはLeetCode 764の最大プラス記号を実装しています(激しい再帰)

764.最大プラス記号

(0、0)から(N-1、N-1)の範囲のサイズの2Dグリッドグリッドでは、各セルは1です。ただし、鉱山で指定されたセルは0です。グリッドに1を含む最大の軸揃えプラス記号は何ですか?プラス記号の順序を返します。プラス記号が見つからない場合は、0を返します。

1からなるk "次数"軸対称 "プラス記号"には、中央グリッドグリッド[x] [y] = 1と、長さk-で中央から上下左右に伸びる4つの拡張があります。 1. 1で構成されるアーム。kの次数の「軸対称」プラス記号の例を以下に示します。プラス記号でマークされたすべてのグリッドは1である必要があることに注意してください。他のグリッドは0または1の場合があります。

次数kの軸対称プラス記号の例:

ステージ1:
000
010
000

ステージ2:
00000
00100
01110
00100
00000

ステップ3:
0000000
0001000
0001000
0111110
0001000
0001000
0000000

例1:

入力:N = 5、地雷= [[
4、2 ]] 出力:2
説明:

11111
11111
11111
11111
11011

上部グリッドでは、最大のプラス記号の順序は2のみです。図には標識が記されています。

例2:

入力:N = 2、地雷= []
出力:1
説明:

11
11

2次のプラス記号はなく、1次のプラス記号があります。

例3:

入力:N = 1、鉱山= [[0、0]]
出力:0
説明:

0

プラス記号がない場合、0を返します。

ヒント:

整数Nの範囲:[1、500]。地雷
の最大長は5000です。
地雷[i]は2の長さで、[0、N-1]の2つの数値で構成されます
(さらに、C、C ++を使用しますまたは、C#プログラミングは少し短い時間制限で判断されます。)

class Solution { 
     
    public int orderOfLargestPlusSign(int N, int[][] mines) {
        if (N==0)return 0;

        int max_k=0;

        //填充一个2D网格matrix出来
        int matrix[][] = new int[N][N];
        for (int i=0;i<N;i++)
            Arrays.fill(matrix[i],1);
        int m = mines.length;
        for (int i=0;i<m;i++)
            matrix[mines[i][0]][mines[i][1]]=0;

        int dp[][] = new int[N][N];
        int count = 0;
        //初始化
        //求左、右
        for (int i=0;i<N;i++){

            //求左臂并将值放入dp left->right
            count = 0;
            for (int j=0;j<N;j++){
                count = matrix[i][j]==1?count+1:0;
                dp[i][j]= count;
            }

            //求右臂 并将当前dp与右臂之间的最小值放入dp right->left
            count = 0;
            for (int j=N-1;j>=0;j--){
                count = matrix[i][j]==1?count+1:0;
                dp[i][j]=Math.min(dp[i][j],count);
            }
        }
        //求上、下
        for (int j=0;j<N;j++){
            //求上臂 并将当前dp与上臂间的最小值放入dp up->down
            count = 0;
            for (int i=0;i<N;i++){
                count = matrix[i][j]==1?count+1:0;
                dp[i][j]=Math.min(dp[i][j],count);
            }
            //求下臂 并将当前dp与下臂间的最小值放入dp down->up
            //此时的整个dp数组中的最大值就是所求的k
            count = 0;
            for (int i=N-1;i>=0;i--){
                count = matrix[i][j]==1?count+1:0;
                dp[i][j]=Math.min(dp[i][j],count);
                max_k=Math.max(max_k,dp[i][j]);
            }
        }

        return max_k;
    }
}
リリース1833元の記事 ウォンの賞賛30000 + ビュー486万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/105557981