LeetCode-【动态规划】- 最大加号标志

57 篇文章 3 订阅
51 篇文章 1 订阅

在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1。网格中包含 1 的最大的轴对齐加号标志是多少阶?返回加号标志的阶数。如果未找到加号标志,则返回 0。

一个 k" 阶由 1 组成的“轴对称”加号标志具有中心网格  grid[x][y] = 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-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, mines = [[4, 2]]
输出: 2
解释:

11111
11111
11111
11111
11011

在上面的网格中,最大加号标志的阶只能是2。一个标志已在图中标出。

示例 2:

输入: N = 2, mines = []
输出: 1
解释:

11
11

没有 2 阶加号标志,有 1 阶加号标志。

示例 3:

输入: N = 1, mines = [[0, 0]]
输出: 0
解释:

0

没有加号标志,返回 0 。

提示:

  1. 整数N 的范围: [1, 500].
  2. mines 的最大长度为 5000.
  3. mines[i] 是长度为2的由2个 [0, N-1] 中的数组成.
  4. (另外,使用 C, C++, 或者 C# 编程将以稍小的时间限制进行​​判断.)

题解:对数组中值为1的点,判断它的四个方向(i+k,j),(i-k,j),(i,j-k),(i,j+k)其中0=<k<n,这样做是从这点开始不断判断它的第一层是否为1,第二层是为1,第三层。。。,如果在某一层遇到某个位置值不为1,直接结束遍历,记录此时最大加号的阶。不断比较数组元素为1的最大加号的阶,最后得到最大值。

class Solution {
    static int res=1;
    public static void dfs(int[][] grid,int n,int i,int j){
        for(int k=1;k<n;k++){
            int a=i+k,b=i-k,c=j+k,d=j-k;
            if(a>=0&&a<n&&b>=0&&b<n&&c>=0&&c<n&&d>=0&&d<n){
                if(grid[i][c]==1&&grid[i][d]==1&&grid[a][j]==1&&grid[b][j]==1){
                    res++;
                }
                else
                    break;
            }
        }
    }
    public int orderOfLargestPlusSign(int N, int[][] mines) {
        int[][] grid=new int[N][N];
        for(int[] g:grid)
            Arrays.fill(g,1);
        for(int[] m:mines)
            grid[m[0]][m[1]]=0;
        int max=0;
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(grid[i][j]==1){
                    res=1;
                    dfs(grid,N,i,j);
                    max=Math.max(max,res);
                }       
            }
        }
        return max;
    }
}

巧妙解法:参考:https://blog.csdn.net/magicbean2/article/details/79627099

class Solution {
    public int orderOfLargestPlusSign(int N, int[][] mines) {
    int[][] grid = new int[N][N];
        
    for (int i = 0; i < N; i++) {
        Arrays.fill(grid[i], N);
    }
        
    for (int[] m : mines) {
        grid[m[0]][m[1]] = 0;
    }
        
    for (int i = 0; i < N; i++) {
        for (int j = 0, k = N - 1, l = 0, r = 0, u = 0, d = 0; j < N; j++, k--) {
            grid[i][j] = Math.min(grid[i][j], l = (grid[i][j] == 0 ? 0 : l + 1));
            grid[i][k] = Math.min(grid[i][k], r = (grid[i][k] == 0 ? 0 : r + 1));
            grid[j][i] = Math.min(grid[j][i], u = (grid[j][i] == 0 ? 0 : u + 1));
            grid[k][i] = Math.min(grid[k][i], d = (grid[k][i] == 0 ? 0 : d + 1));
        }
    }
        
    int res = 0;
        
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            res = Math.max(res, grid[i][j]);
        }
    }
        
    return res;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值