力扣每日一题:764. 最大加号标志【dp题】

在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1mines[i] = [xi, yi]表示 grid[xi][yi] == 0

返回  grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0 。

一个 k 阶由 1 组成的 “轴对称”加号标志 具有中心网格 grid[r][c] == 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1,由 1 组成的臂。注意,只有加号标志的所有网格要求为 1 ,别的网格可能为 0 也可能为 1 。

示例 1:

输入: n = 5, mines = [[4, 2]]
输出: 2
解释: 在上面的网格中,最大加号标志的阶只能是2。一个标志已在图中标出。

示例 2:

输入: n = 1, mines = [[0, 0]]
输出: 0
解释: 没有加号标志,返回 0 。

提示:

  • 1 <= n <= 500
  • 1 <= mines.length <= 5000
  • 0 <= xi, yi < n
  • 每一对 (xi, yi) 都 不重复

分析:题目意思,就是找到一个形状为加号 的图形,而且是一个对称轴的加号,我们就可以往4个方向进行辐射,我们可以定义4个数组来进行维护,分别表示的意思是上下左右四个方向连续1的个数,然后在遍历一遍,取这四个方向的最小值中的最大值就OK了,就是有点麻烦,一个体力活

class Solution {
    public int orderOfLargestPlusSign(int n, int[][] mines) {
        int res = 0 ;
        int grid [][]= new int[n][n];
        for (int i =0 ;i<n;i++){
            Arrays.fill(grid[i],1);
        }
        
        for (int i =0 ;i<mines.length;i++){
            grid[mines[i][0]][mines[i][1]] = 0 ;
        }
        
        int up [][] = new int[n][n];
        int down [][] = new int[n][n];
        int left [][] = new int[n][n];
        int  right [][] = new int[n][n];
        
        for (int i =0 ;i<n ;i++){
            int count =0 ; 
            for (int j =0 ;j<n;j++){
                if (grid[i][j]==0){
                    count = 0 ;
                }else {
                    count+=1 ; 
                }
                left[i][j] = count ; 
            }
            count =0 ; 
            
            for (int j = n-1 ; j>=0;j--){
                if (grid[i][j]==0){
                    count =0 ;
                }else {
                    count++ ; 
                }
                right[i][j] = count ; 
            }
        }
        
        for (int j =0 ;j<n;j++){
            int  count =0 ;
            for (int i =0 ;i<n;i++){
                if (grid[i][j]==0){
                    count = 0 ;
                }else {
                    count++ ; 
                }
                up[i][j] =count ; 
            }
            count =0 ; 
            for (int i= n-1 ;i>=0 ;i--){
                if (grid[i][j]==0){
                    count = 0 ;
                }else {
                    count++ ;
                }
                down[i][j] =count ;
            }
        }
        
        
        for (int i =0 ;i<n ;i++){
            for (int j =0 ;j< n ;j++){
                int cnt = Math.min(Math.min(up[i][j],down[i][j]),Math.min(right[i][j],left[i][j]));
                
                res = Math.max(cnt,res) ; 
            }
        }
        




        return res ;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little Chen1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值