dp:221. 最大正方形

news2024/9/19 21:45:51

221. 最大正方形
在这里插入图片描述
看到这个题目真能立马想到dp吗?貌似很难,即使知道是一个dp题也很难想到解法。

直观来看,使用bfs以一个点为中点进行遍历,需要的时间复杂度为 O ( n 2 m 2 ) O(n^2m^2) O(n2m2)

但是可以很容易发现,如果求以一个点为角 构成的最大正方形,可以通过其他周围的点作为角来快速找到这个点的最大正方形。

我们用数组存以该点为右下角,左下角,左上角,右上角的最大正方形,可以通过周围的转移,然后求出以它为“中心”构成的最大正方形。于是有如下代码

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        if(n == 1 && m == 1) return matrix[0][0];
        vector<vector<vector<int>>> dp(n, vector<int>(m, vector<int>(4, 0)));
        int ans = 0;
        for(int j = 0; j < m; ++ j){
            dp[0][j][0] = dp[0][j][1]= dp[0][j][2] = dp[0][j][3] = matrix[0][j];
        }
        for(int i = 1; i < n - 1; ++ i){
            dp[i][0][0] = dp[i][0][1] = dp[i][0][2] = dp[i][0][3] = matrix[i][0];
            for(int j = 1; j < m - 1; ++ j){
                dp[i][j][0] = min(dp[i - 1][j][0], min(dp[i - 1][j - 1][0], dp[i][j - 1][0])) + 1;
                dp[i][j][1] = min(dp[i - 1][j][1], min(dp[i - 1][j + 1][1], dp[i][j + 1][1])) + 1;
                ····
            }
            //最后一列
        }
        //最后一行

        return ans * ans;
    }
};

但是实际上,以该点为右下角就足以解决这个问题,因为对于任何一个最大正方形而言,它一定有一个右下角,那么找到这个右下角能构成的最大正方形就是这个正方形了

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        if(n == 1 && m == 1) return matrix[0][0] - '0';
        vector<vector<int>> dp(n, vector<int>(m, 0));
        int ans = 0;
        for(int i = 0; i < m; ++ i){
            dp[0][i] = matrix[0][i] - '0';
            ans = max(ans, dp[0][i]);
        }
        for(int i = 1; i < n; ++ i){
            dp[i][0] = matrix[i][0] - '0';
            ans = max(ans, dp[i][0]);
            for(int j = 1; j < m; ++ j){
                if(matrix[i][j] == '0') dp[i][j] = 0;
                else dp[i][j] = min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
                ans = max(ans, dp[i][j]);
            }
        }
        return ans * ans;
    }
};

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

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

相关文章

昂科烧录器支持MindMotion灵动微电子的32位微控制器MM32SPIN360C

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中MindMotion灵动微电子的32位微控制器MM32SPIN360C已经被昂科的通用烧录平台AP8000所支持。 MM32SPIN360C使用高性能的ARM CortexM0为内核的32位微控制器&#xff0c;5V输出的L…

九大原则,轻松构建个人高效SOP

1、原则一、工作汇报SOP SCQA模型(升职加薪的关键!&#xff09; 清晰定义问题和提出解决方案 类别 关键词 解读 S - Situation 情景 陈述项目背景&#xff0c;目标&#xff0c;愿景 C - Complication 冲突 讲卡点&#xff0c;讲冲突 Q - Question 疑问-问题 这些冲…

vue2 封装插槽组件

安装 element-ui npm install element-ui --save ---force main.js 导入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue; Vue.use(ElementUI); new Vue({ el: #app, render: h > h(Ap…

未来RPA财税的发展前景

近年来&#xff0c;全球数字化进程持续提速&#xff0c;越来越多企业受到效率及运营成本的压力&#xff0c;正努力寻求企业增长发展的新路径&#xff0c;而财务作为企业战略的“大脑”&#xff0c;成为企业数字化转型的重要突破口。RPA技术由于能够自动化各种重复性和繁琐的任务…

如何利用智能电子工牌提高酒店员工的服务技能和沟通效率?

智能电子语音工牌的基本功能 智能电子录音工牌通常集成了录音、语音识别、数据上传等功能&#xff0c;能够在员工与客户互动的过程中实时录制音频&#xff0c;并将数据上传到云端服务器。这些工牌还可能配备定位功能&#xff0c;以便追踪员工的位置和服务轨迹。通过语音识别技…

职场里有3个错觉,如果正好说中你,抓紧醒过来

1.没有我肯定不行。 其实大多数公司里的绝大多数人都可以被替代&#xff0c;无非是在个体层面替代的成本高一点、低一点罢了。 所以千万别高估自己&#xff0c;否则会造成极其严重的误判。 我之前的公司有一个部门&#xff0c;这里面有个员工&#xff0c;专业对口&#xff0…

vue-cli搭建项目笔记

1. 在指定位置打开终端 2. 运行 指令 vue create xtx选择 vue2 等待创建完成。。。。。 大概5.52s完成 3.启动项目 进入 项目 目录 cd xtx 启动 yarn run serve 4. 访问 浏览器 访问 localhost:8080 5. 项目开发 清空项目 App.vue 注意&#xff1a;每一个vue组件中的…

柯桥零基础学韩语韩语俗语韩语日常口语培训

반모반말모드 반말모드 非敬语模式 존모존댓말모드 존댓말모드 敬语模式 2 비담 비담비주얼담당 비주얼 담당, 意思就是颜值担当。 3 보배 보배보조배터리15857575376# 随身充、充电宝 如果单讲单词&#xff0c;是宝贝的意思。网络用语角度理解的话就是充电宝 4 삼귀다…

这4个思维导图软件剪辑就是整理思维的魔法工具。

思维导图作为一个能够帮助我们呈现可视化内容&#xff0c;激发创意以及提高我们记忆力的工具&#xff1b;正在被越来越多的人使用。然而选择一款适合自己的脑图软件&#xff0c;会为我们的学习、工作和生活带来很大的便利&#xff0c;如果你依旧还在寻找的话&#xff0c;不妨看…

SVM解决线性不可分问题

在一个棋盘上杂糅的摆放着黑白两种棋子&#xff0c;要求我们以最快的速度将它们各自分开&#xff0c;这时我们应该如何做呢&#xff1f;也许喜欢金庸武侠的小伙伴已经想到了答案。 假如你是一位拥有深厚内力的大侠&#xff0c;你直接可以拍盘而起&#xff0c;让棋子们飞起来&am…

secExample靶场之java反序列化漏洞复现

我是使用kali虚拟机搭建的靶场&#xff0c;具体搭建步骤可以看我之前的博客内容。 访问靶机地址&#xff0c;打开java反序列化的 点进去后是如图的页面&#xff0c;随便输入一信息。 可以看到敏感信息直接显示在了页面上。 访问192.168.189.141:8080/cors1&#xff0c;可以看到…

揭秘律师界的“超能力”:AI如何让繁琐工作变轻松?

律师朋友们&#xff0c;你们是否也曾为文书堆成山、法规更新追不上、案例分析耗时久而头疼&#xff1f;我懂你们的痛&#xff0c;毕竟&#xff0c;咱也是从那个“人肉检索机”时代走过来的。不过&#xff0c;今天我要分享一个秘密武器——AI工具&#xff0c;它们真的能帮咱们把…

由浅入深的了解进程(3)

进程状态 进程状态1、Linux中的进程状态1、1、进程状态R和S1、2、进程状态T/t1、3、进程状态D1、4、进程状态X和Z 2、僵尸进程3、孤儿进程4、bash概括5、进程的阻塞&#xff0c;挂起和运行5、1、运行5、2、阻塞5、3、挂起 进程状态 任何一个进程都要有自己的代码和数据一样&am…

CSS雷达光波效果(前端雷达光波效果)

前言 CSS雷达光波效果是一种视觉动画效果&#xff0c;常用于模仿雷达扫描或检测的视觉反馈。这种效果通常涉及到动态的圆形或弧形图案&#xff0c;它们从一个中心点向外扩散&#xff0c;类似于水面上的涟漪或雷达扫描线。以下是创建CSS雷达光波效果的一些关键技术和步骤&#…

[C++] 容器适配器:深入理解Stack与Queue的底层原理

文章目录 容器适配器简介deque的缺陷为什么使用deque作为stack和queue的底层默认容器 stack和queue的简单讲解Stack&#xff08;栈&#xff09;栈的操作图示栈的相关接口 Queue&#xff08;队列&#xff09; Stack和Queue的模拟实现Stack&#xff08;栈&#xff09;作为容器适配…

新时代的北斗时空智能:助力节能减排,共筑低碳未来

随着全球环境问题日益加剧&#xff0c;节能减排和低碳生活成为了全世界共同的目标。中国作为一个崛起中的大国&#xff0c;在这一领域肩负着重要的责任。近年来&#xff0c;中国的北斗卫星导航系统&#xff08;BDS&#xff09;异军突起&#xff0c;其时空智能技术在多个方面特别…

盘点国内ERP系统,看看你都用过哪一款?

在数字化转型的浪潮中,企业资源计划(ERP)系统已成为企业提升管理效率、优化资源配置的关键工具。国内市场上,众多优秀的ERP软件产品如雨后春笋般涌现,为企业提供了丰富多样的选择。 本文将为您深度盘点10款国产高端ERP软件,重点围绕公司背景、专业实力、产品核心能力、解…

【机器学习】逻辑损失函数的基本概念和探索为什么平方误差损失函数不适用于逻辑回归以及探索逻辑损失函数

引言 在机器学习中&#xff0c;逻辑损失函数&#xff08;Logistic Loss Function&#xff09;是用于训练逻辑回归模型的一种损失函数。逻辑回归是一种广泛用于分类问题的模型&#xff0c;特别是用于二分类问题&#xff0c;它的目标是预测一个实例属于两个类别中的一个的概率 文…

经验模态分解 (EMD) 及其在信号降噪中的应用

引言 在信号处理领域&#xff0c;处理非线性和非平稳信号是一个重要的挑战。传统的信号处理方法&#xff0c;如傅里叶变换和小波变换&#xff0c;虽然在处理线性和稳态信号方面表现出色&#xff0c;但在面对复杂信号时往往力不从心。经验模态分解 (Empirical Mode Decompositi…

【IO】 对于fread,fwrite,time_t,fseek等操作,写日志文件,完成文件的拷贝,对bmp图像进行读写操作;

目录 1>写一个日志文件&#xff0c;将程序启动后&#xff0c;每一秒的时间写入到文件中 ​编辑 2>使用fread、fwrite完成两个文件的拷贝 3>实现对bmp图像的读写操作 1>写一个日志文件&#xff0c;将程序启动后&#xff0c;每一秒的时间写入到文件中 1、2024-7…