LeetCode-764. 最大加号标志【动态规划,二维数组】

news2024/11/26 10:48:48

LeetCode-764. 最大加号标志【动态规划,二维数组】

  • 题目描述:
  • 解题思路一:动态规划。用一个n*n的数组记录每个点上下左右方向上为1的最小值。最后ans返回数组中最大的加号。
  • 解题思路二:优化1。
  • 解题思路三:0

题目描述:

在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1。mines[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) 都 不重复
https://leetcode.cn/problems/largest-plus-sign/

解题思路一:动态规划。用一个n*n的数组记录每个点上下左右方向上为1的最小值。最后ans返回数组中最大的加号。

class Solution {
public:
    int orderOfLargestPlusSign(int n, vector<vector<int>>& mines) {
        vector<vector<int>> dp(n, vector<int>(n, n));//初始化一个所有值全为n的二维网格,因为遍历是取min
        unordered_set<int> banned;//记录为0的点
        for (auto &&vec : mines) banned.emplace(vec[0] * n + vec[1]);
        int ans = 0;
        for (int i = 0; i < n; i++) {
            int count = 0;
            /* left */
            for (int j = 0; j < n; j++) {
                if (banned.count(i * n + j))count = 0;
                else count++;
                dp[i][j] = min(dp[i][j], count);
            }
            count = 0;
            /* right */ 
            for (int j = n - 1; j >= 0; j--) {
                if (banned.count(i * n + j)) count = 0;
                else count++;
                dp[i][j] = min(dp[i][j], count);
            }
        }
        for (int i = 0; i < n; i++) {
            int count = 0;
            /* up */
            for (int j = 0; j < n; j++) {
                if (banned.count(j * n + i)) count = 0;
                else count++;
                dp[j][i] = min(dp[j][i], count);
            }
            count = 0;
            /* down */
            for (int j = n - 1; j >= 0; j--) {
                if (banned.count(j * n + i)) count = 0;
                else count++;
                dp[j][i] = min(dp[j][i], count);
                ans = max(ans, dp[j][i]);//ans取最大的加号
            }
        }
        return ans;
    }
};

时间复杂度:O(n2)
空间复杂度:O(n2)

解题思路二:优化1。

很简单,memset是一个字节一个字节设置的,取要赋的值的后8位二进制进行赋值。

1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。

之所以输入0,-1时正确,纯属巧合。

0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1

总结:memset()只有在初始化-1,0时才会正确。想要初始化为其他值,就乖乖的DIY吧!
memset 函数适合初始化 0 或 -1,如果是其他值,还是老老实实用 for 循环吧。

class Solution {
public:
    int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
        if (mines.size() == N * N) return 0;
        if (mines.size() > N * N - 5) return 1;
        int grid[N][N];
        int arm[N][N][4];
        // set all the value of grid to be "1", this is a trick to use "-1"
        memset(grid, -1, sizeof(grid));
        // set all the value of arm to be "0"
        memset(arm, 0, sizeof(arm));
        for (auto& v : mines) {
            grid[v[0]][v[1]] = 0;
        }
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                if (grid[i][j] == 0) continue;
                arm[i][j][0] = 1 + ((i > 0) ? arm[i - 1][j][0] : 0);
                arm[i][j][1] = 1 + ((j > 0) ? arm[i][j - 1][1] : 0);
            }
        }
        for (int i = N - 1; i >= 0; --i) {
            for (int j = N - 1; j >= 0; --j) {
                if (grid[i][j] == 0) continue;
                arm[i][j][2] = 1 + ((i < N - 1) ? arm[i + 1][j][2] : 0);
                arm[i][j][3] = 1 + ((j < N - 1) ? arm[i][j + 1][3] : 0);
            }
        }
        int res = 0;
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                if (grid[i][j] == 0) continue;
                int s = min(min(arm[i][j][0], arm[i][j][1]), min(arm[i][j][2], arm[i][j][3]));
                res = max(res, s);
            }
        }
        return res;
    }
};

时间复杂度:O(n2)
空间复杂度:O(n2)

解题思路三:0


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

word制作多个单位联合发文的文件头

一、前言 word制作多个单位联合发文的文件头&#xff0c;好像不难。但是做起来&#xff0c;却发现&#xff0c;自己的只是储备还是不够&#xff0c;居然花费了1个多小时才搞定....哎 二、遇到问题 开始思路是想使用【分栏】来操作&#xff0c;但是不得其法&#xff0c;搞了一…

驱动开发基础知识

文章目录记录驱动开发前的知识储备工作一、驱动开发环境搭建二、驱动开发框架&#xff08;重点&#xff1a;WDF框架&#xff09;1、前世今生&#xff08;1&#xff09;Vista简介&#xff08;2&#xff09;发展历史2、基于框架的驱动程序的 WDM&#xff08;1&#xff09;驱动程序…

linux(1.nginx基础 2.使用Nginx负载均衡及动静分离)

一.nginx基础 目录 1. Nginx使用场景2. Nginx中的进程 2.1 Nginx中的多进程模型2.2 多进程模式的优点&#xff1a;2.3 缓存3. Ngnix的负载均衡策略 3.1 轮询法3.2 加权轮询3.3 原地址哈希3.4 最小连接数法3.5 Fair3.6 url_hash3. Nginx配置文件4. Nginxtomcat 集群示例 4.1 下…

c++学习-STL常用函数

第八部分-STL常用函数 5.1 常用遍历算法 5.1.1 for_each 5.1.2 transform 5.2 常用查找算法 5.2.1 find 5.2.2 find_if 5.2.3 adjacent_find 面试题中如果出现查找相邻重复元素&#xff0c;记得用stl中的adjacent_find算法 5.2.4 binary_search 5.2.5 count 5.2.6 count_if 5.…

【双十一特辑】爱心代码(程序员的浪漫)-李峋

前言 最近《点燃我温暖你》中李峋的爱心代码超级火&#xff0c;看着特别心动&#xff0c;这不&#xff0c;光棍节快到了&#xff0c;给兄弟们教学一波爱心代码&#xff0c;赶在双十一前表白&#xff0c;让这个双十一不在是孤单一个人&#xff01;目录 前言 C语言简易爱心代码…

final 关键字 —— 限制继承、限制虚函数重写

final 关键字有两个作用&#xff0c;一个是限制继承&#xff0c;一个是限制重写。 目录 1、限制继承 (1) 基类的构造函数设为私有 (2) 基类类名后面加上 final 关键字修饰 2、限制虚函数重写 1、限制继承 限制继承有两种方式&#xff0c;一种是将基类的构造函数设为私有&am…

谷粒商城-基础篇(详细流程梳理+代码)

文章目录前言一、项目环境搭建1.1、安装virtualbox以及vagrant1.2、Docker安装MySQL与Redis1.3、前后端开发工具统一配置1.4、Git工具安装与配置1.5、Gitee创建仓库与IDEA导入1.6、构建微服务模块1.7、编写.gitignore文件&#xff08;忽略上传gitee文件配置&#xff09;1.8、数…

【云原生之K8s】 K8s资源控制及探针检查

文章目录一、资源限制1.资源限制的使用2.request资源&#xff08;请求&#xff09;和limit资源&#xff08;约束&#xff09;3.Pod和容器的资源请求和限制4.官方文档示例5.资源限制实操5.1 编写yaml资源配置清单5.2 释放内存&#xff08;node节点&#xff0c;以node1为例&#…

昨晚,我用python帮学妹P证件照自拍,然后发现。。。

人生苦短&#xff0c;我用Python前因后果先上效果准备工作证件照尺寸调整证件照背景调整各种背景颜色图片完整代码结尾最后前因后果 事情是这样的 晚上我正在聚精会神写代码&#xff08;打游戏~&#xff09; 突然&#xff0c;收到学妹给我发来的消息 还有一张自拍照 而且是…

基于stm32单片机的超声波测距显示倒车雷达提醒报警系统Proteus仿真

资料编号&#xff1a;145 下面是相关功能视频演示&#xff1a; 145-基于stm32单片机的超声波测距显示倒车雷达提醒报警系统Proteus仿真&#xff08;源码原理图仿真论文&#xff09;设计内容 本次嵌入式课程设计综合实验的内容为倒车测距系统。以proteus keilU5为模拟硬件基础…

Android studio中控件TextView学习

1、TextView 基础属性 layout_ width; 组件的宽度layout. _height: 组件的高度id: 为TextView设置- -个组件idtext; 设置显示的文本内容textColor: 设置字体颜色textStyle: 设置字体风格&#xff0c;三个可选值: n normal(无效果)&#xff0c;bold(加粗)&#xff0c; italic(斜…

Springboot @Async 失效的坑

异步应用场景 为了提高接口的响应性能&#xff0c;当业务非常复杂的情况下&#xff0c;可以将一部分跟业务关联性不是特别强的逻辑进行异步处理。如日志记录、短信发送、增加积分等。通常而言会将此类业务逻辑通过异步的方式进行处理&#xff0c;从而加快接口的响应速度&#…

【HMS Core】集成多种HMS Core服务,让APP成为旅行小助手

1 介绍 Duration: 5:00 总览 旅行者能够使用该应用在华为地图上搜索附近名胜景点、游玩去处或是附近ATM、餐馆和医院等。 服务场景描述 Tourism应用通过集成机器学习服务的地标识别能力&#xff0c;能够提供旅行过程所有必要的信息&#xff0c;还可以识别图片中的地标建筑。…

[Python]字符串常用操作与方法

前言 系列文章目录 [Python]目录 文章目录前言1. 字符串的常用操作1.1 格式化输出1.1.1 %1.1.1.1 语法1.1.1.2 字符串格式操作符(%)的格式化符号%c&#xff1a;以字符的形式格式化输出整数或长度为1的字符串%r&#xff1a;将数据格式化为供解释器读取的形式%s&#xff1a;将数据…

一文带你精通Git

一文带你精通git回顾git对象树对象提交对象重新认识git 基本命令git 高层命令分支&#xff08;特别重要&#xff09;分支冲突&分支合并git 存储git 后悔药远程分支和团队协作远程仓库冲突回顾 博主之前直接已经写过了git的相关基础博客了,老铁可以自行去查看。本篇文章的目…

【分割链表】

目录&#xff1a;前言一、题目描述二、算法思想&#xff08;一&#xff09;值交换1、题目解析2、代码实现&#xff08;二&#xff09;重构链表1、题目解析2、代码实现总结前言 大家好&#xff0c;今天我们来了解一下leetcode中比较简单的单链表问题。 一、题目描述 题目描述如…

MySQL事务隔离级别

MySQL的四种隔离级别 读未提交读提交可重复读串行化 隔离级别可以通过MySQL的视图来实现。 读未提交 读未提交是一个事务仅修改了数据但还未提交时&#xff0c;本次修改可以便可被其他事务查询到变更后的值。读未提交隔离级别下&#xff0c;其他事务进行查询时&#xff0c;直…

新手小白学JAVA 日期类Date SimpleDateFormat Calendar

Date日期类 类 Date 表示一个特定的瞬间&#xff0c;精确到毫秒 1.1 Date的构造函数 Date() 分配一个 Date 对象&#xff0c;以表示分配它的时间&#xff08;精确到毫秒&#xff09; Date(long date) 分配一个 Date 对象&#xff0c;表示自从标准基准时间起指定时间的毫秒数 标…

【Java实验五】继承与多态

一、实验一 对于父类的含参构造方法&#xff0c;子类必须通过super调用&#xff0c;重写父类的构造方法 设计一个应用程序要求&#xff1a; 设计一个表示二维平面上点的类Point&#xff0c;包含有表示坐标位置的protected类型的成员变量x和y&#xff0c;获取和设置x和y值的publ…

SpringBoot项目的创建(三):手动创建一个Maven工程,然后引入SpringBoot所需的dependency来完成 (不需联网,但复杂)

SpringBoot项目的创建1.配置Maven环境。2.创建一个新的maven项目3.创建出来的目录结构4 继承springboot父项目5.添加Spring Boot Maven插件6.添加spring和web模块的依赖7.创建入口类8.添加代码测试1.配置Maven环境。 在以maven方式创建Spring Boot项目之前&#xff0c;需要先确…