​力扣解法汇总764. 最大加号标志

news/2024/7/5 2:43:44

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

在一个 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) 都 不重复

解题思路:

* 解题思路:
* 我们先用一种最笨的方法来实现,首先构建一个二维数组,对应的就是n*n的矩阵上的每个数字的值,然后把mines进行填充。
* 然后从最中间开始搜索,一层一层往外搜索每个点所对应的最大阶数,如果最大阶数达到理论上的最大值,则直接返回即可。
* 然后我们再看如何优化,每一行进行遍历搜索的时候,如果第n位读到了0,则说明至少n+i范围内,最大值就是i,而且如果存在,这个点的坐标一定是n+i。
* 此时,我们可以让当前的最大长度result为i,直接跳过中间的部分,直接从n+result位开始搜索,大幅节省计算时间。
* 这个优化方案就先不写了

代码:

public class Solution764 {

    public int orderOfLargestPlusSign(int n, int[][] mines) {
        int[][] matrix = new int[n][n];
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                matrix[i][j] = 1;
            }
        }
        for (int[] mine : mines) {
            matrix[mine[0]][mine[1]] = 0;
        }
        int result = 0;
        int centerX = n % 2 == 1 ? (n - 1) / 2 : n / 2;
        for (int step = 0; step <= centerX; step++) {
            for (int y = centerX - step; y <= centerX + step; y++) {
                int maxLength = centerX - step + 1;
                for (int x = centerX - step; x <= centerX + step; x++) {
                    result = Math.max(result, searchMaxLength(x, y, matrix, maxLength));
                    if (maxLength == result) {
                        return result;
                    }
                }
            }
        }
        return result;
    }

    private int searchMaxLength(int x, int y, int[][] matrix, int maxlength) {
        if (y < 0 || y >= matrix.length || x < 0 || x >= matrix.length) {
            return 0;
        }
        int value = matrix[y][x];
        if (value == 0) {
            return 0;
        }
        int length = 1;
        for (; length <= maxlength; ) {
            if (y + length >= matrix.length || matrix[y + length][x] == 0) {
                break;
            }
            if (y - length < 0 || matrix[y - length][x] == 0) {
                break;
            }
            if (x + length >= matrix.length || matrix[y][x + length] == 0) {
                break;
            }
            if (x - length < 0 || matrix[y][x - length] == 0) {
                break;
            }
            length++;
        }
        return length;
    }

}


http://lihuaxi.xjx100.cn/news/145339.html

相关文章

ubuntu设置 Git 代理(http/git/ssh)

转载请标明转载自&#xff1a;https://blog.csdn.net/chenbb8/article/details/127766866 使用git拉取github之类的网站里的远程仓库的时候&#xff0c;因为网络问题&#xff0c;访问速度不稳定&#xff0c;因此需要特殊设置以达到加速clone和push的效果。 git的远程仓库有三种…

第3 章 信息文档和配置管理

第3 章 信息文档和配置管理 3.1 信息系统项目文档及其管理 1.信息系统项目相关信息&#xff08;文档&#xff09;种类 软件文档一般分为三类&#xff1a;开发文档、产品文档、管理文档。 (1)开发文档描述开发过程本身&#xff0c;基本的开发文档包括&#xff1a; 可行性研究报…

数据库随堂笔记(6)ᝰ数据库设计

>>>数据库设计&#xff08;需求&#xff0c;设计&#xff0c;运行&#xff0c;维护&#xff09; 必须适当开拓难题&#xff0c;否则学来学去都是自己会的东西 目录 1.数据库设计概述 2.需求分析 3.概念结构设计 4.逻辑结构设计 5.物理结构设计 6.数据库的实施和…

【Revit二次开发】模型中存储数据——参数和外部存储(Parameter, Schema and Entity)

模型中存储数据参数读取写入外部存储SchemaEntity快速获取外部存储参数参数 在Revit平台API中&#xff0c;每个图元对象都有参数属性&#xff0c;它是隶属于图元所有属性的集合&#xff0c;在此集合中更改属性值。 每个图元的参数都有一个与之关联的ElementId类型的ID大多数参…

外汇天眼:外汇走势图怎么看涨跌,怎么看外汇盘面走势图?

炒汇的难点&#xff0c;一是分辨行情是多头&#xff0c;空头或盘整形态&#xff0c;二是克服逆市操作的人性弱点&#xff0c;为此既要不断积累经验增加认知&#xff0c;又要对基本面技术面勤加研判&#xff0c;舍此并无捷径可走。 让趋势做你的朋友 外汇走势图怎么看涨跌 我…

flutter 图片加载缓存机制深入源码解析

flutter 图片加载缓存机制深入源码解析前言一、图片控件二、缓存管理三、新增缓存四、缓存清理五、图片加载六、滑动中处理总结前言 最近去看了一些flutter 中的图片加载机制的源码&#xff0c;在这里和大家分享一下。 目前在flutter 中&#xff0c;我们常用的Image 图片加载…

Java程序员不得不会的124道面试题(含答案)

1&#xff09;Java 中能创建 volatile 数组吗&#xff1f; 能&#xff0c;Java 中可以创建 volatile 类型数组&#xff0c;不过只是一个指向数组的引用&#xff0c;而不是整个数组。我的意思是&#xff0c;如果改变引用指向的数组&#xff0c;将会受到 volatile 的保护&#x…

服务器测试之linux下RAID/HBA管理命令汇总

** sas3ircu ** 对LSI3008阵列卡的管理&#xff0c;命令用法与sas2ircu类似。提供的为可执行文件无需安装 ./sas3ircu 0 locate 2:$A on ./sas3ircu -h 查看帮助信息 ./sas3ircu list 查看所有RAID控制器信息 ./sas3ircu 0 display 查看第一块RAID控制器、volume、物理磁…