python最大正方形的面积_LeetCode 221. 最大正方形 | Python

221. 最大正方形

题目

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例:

输入:

1 0 1 0 0

1 0 1 1 1

1 1 1 1 1

1 0 0 1 0

输出: 4

解题思路

思路:动态规划

本篇幅使用动态规划的原理来解决该问题。我们用 dp(i, j) 表示以 (i, j) 为右下角,且只包含 1 的正方形的边长最大值。如果能够求出所有的 dp(i, j) 值,其中最大值就是最大正方形的边长,其平方就是我们要求的面积。

根据题意要求,所给的二维矩阵内,只有包含 1 的才能构造正方形。如果 dp(i, j) =为 0 的情况下,讨论是否能够构成正方形并求出最长边就没有意义,因为这位置不能在构成由 1 组成的正方形中。

那么如果该位置为 1 的情况下,就需要考虑三个位置的情况,如下图:

先看下构成正方形的情况,结合上面的图示,如果当前的值为 1,那么要找出最长的边,就需要考虑从当前位置出发,上面,左边,左上的值都必须是 1,只有这样,再加上当前位置才有可能构成正方形。

也就是说,这三个方向都不能是 0。但是如果当前位置为 1,但三个方向受限制的情况下,三个方向的边不一定都一样,那么构成的正方形的边长则需要取三者最短边,再加 1,表示加上当前的位置。

具体如上示图,上面的数字表示以此为正方形右下角的最大边长,其中 ? 表示作为右下角的正方形区域。

其中左图,受左上角 0 的限制,这里可构成的正方形的最长边为 3。

中间的图例中,受上边 0 的限制,这里可构成的正方形的最长边为 2。

最后的图例中,受左边 0 的限制,这里可构成的正方形的最长边为 2。

可以看出,得出的最长边都是上,左,左上三个正方形中最小边长 + 1。

所以状态转移方程为:

dp(i, j) = min(dp(i-1, j), dp(i-1, j-1), dp(i, j-1)) + 1

那么具体的代码实现如下。

代码实现

class Solution:

def maximalSquare(self, matrix: List[List[str]]) -> int:

if len(matrix) == 0:

return 0

rows = len(matrix)

cols = len(matrix[0])

max_side = 0

dp = [[0] * cols for _ in range(rows)]

for i in range(rows):

for j in range(cols):

# 当前的值为 1 时,考虑求构成正方形的最长边

if matrix[i][j] == '1':

# 当前值为 1,处于首行首列时,不考虑左,上,左上三个方向

if i == 0 or j == 0:

dp[i][j] = 1

else:

dp[i][j] = min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1]) + 1

max_side = max(max_side, dp[i][j])

square = max_side ** 2

return square

实现效果

以上就是使用动态规划,找出最长边,进而解决《221. 最大正方形》问题的主要内容。

欢迎关注微信公众号《书所集录》

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

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

相关文章

查询学生选修课程管理系统java_JAVA数据库课程设计学生选课管理系统的

《JAVA数据库课程设计学生选课管理系统的》由会员分享,可在线阅读,更多相关《JAVA数据库课程设计学生选课管理系统的(59页珍藏版)》请在人人文库网上搜索。1、一、课程设计目的通过这次的设计,主要是做出一个小型的管理系统,来加强…

Linux C 中字符串化操作符#

1 #include <stdio.h>2 3 #define dprint( expr ) printf( "%s %d \n", #expr , expr)4 5 int main(void)6 {7 int x 100;8 int y 2;9 10 dprint(x/y); 11 dprint( xy ); 12 dprint( xy2 ); 13 return 0; 14 } 打印信息&…

Poj1207 The 3n + 1 problem(水题(数据)+陷阱)

一、Description Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all poss…

python高级玩法_python pandas to_excel 高级玩法

DataFrame.to_excel(self, excel_writer, sheet_name‘Sheet1‘, na_rep‘‘,float_formatNone, columnsNone, headerTrue, indexTrue,index_labelNone, startrow0, startcol0, engineNone,merge_cellsTrue, encodingNone, inf_rep‘inf‘, verboseTrue,freeze_panesNone):1、f…

jquery对象和dom对象

我们都知道可以通过$(selector)的形式对所有页面的对象进行获取&#xff0c;但是获取到的对象和DOM对象有什么区别呢&#xff0c;下面探讨一下 1.DOM对象 var div1document.getElementById(div1); div1.innerHTMLtest; 这样表示获取一个dom对象&#xff0c;这个对象可以使用所有…

u-boot的Makefile分析

U&#xff0d;BOOT是一个LINUX下的工程&#xff0c;在编译之前必须已经安装对应体系结构的交叉编译环境&#xff0c;这里只针对ARM&#xff0c;编译器系列软件为arm-linux-*。 U&#xff0d;BOOT的下载地址&#xff1a; http://sourceforge.net/projects/u-boot 我下载的是1.1.…

Python学习入门基础教程(learning Python)--6.4 Python的list与函数

list是python下的一种数据类型&#xff0c;他和其他类型如整形、浮点型、字符串等数据类型一样也可作为函数的型参和实参来使用&#xff01; 1.list作为参数 list数据类型可以作为函数的参数传递给函数取做相应的处理&#xff0c;下例是统计“www.jeapedu.com”这个字符串里的非…

python 读取outlook_如何用 Python 读取 Outlook 中的电子邮件

从事电子邮件营销&#xff0c; 准入(opt-in)邮箱列表是必不可少的。你可能已经有了准入列表&#xff0c;同时还使用电子邮件客户端软件。如果你能从电子邮件客户端中导出准入列表&#xff0c;那这份列表想必是极好的。我使用一些代码来将 outlook 配置中的所有邮件写入一个临时…

Java代码服务器上下载图片_Java如何从服务器中下载图片

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URL;import java.net.URLConnection;import org.apache.commons.io.IOUtils;/*** 从服务器中下载图片** param fileName 图片地址* param response* return*/RequestMappi…

U-BOOT之一:BootLoader 的概念与功能

U-BOOT之一&#xff1a;BootLoader 的概念与功能 ——转自《U-BOOT移植S3C2440完全手册》 1.1嵌入式Linux 软件结构与分布 一般情况下嵌入式Linux 系统中的软件主要分为以下几部分&#xff1a; 1) 引导加载程序&#xff1a;其中包括内部ROM 中的固化启动代码和BootLoader 两部分…

设计模式之建造者模式(Builder)

建造者模式原理&#xff1a;建造模式主要是用于产生对象的各个组成部分&#xff0c;而抽象工厂模式则用于产生一系列对象&#xff0c;建造者模式而且要求这些对象的组成部分有序。 代码如下&#xff1a; #include <iostream> using namespace std;class Builder { public…

java写七彩文字_【PS精选案例教程】创建一个漂亮的七彩文字

原标题&#xff1a;【PS精选案例教程】创建一个漂亮的七彩文字效果图&#xff1a;步骤1. 新建一个文档(大小随意)步骤2. 滤镜→渲染→云彩步骤3. 可以按CtrlAltF增加效果步骤4. CtrlJ复制一层步骤5.设置前景色步骤6. 用径向渐变从中间往外拉一个渐变步骤7. 设置“图层1”混合模…

std::copy

如果要把一个序列&#xff08;sequence&#xff09;拷贝到一个容器&#xff08;container&#xff09;中去&#xff0c;通常用std::copy算法&#xff0c;代码如下&#xff1a; std::copy(start, end,std::back_inserter(container)); 这里&#xff0c;start和end是输入序列&…

java 正则 栈溢出_关于Java正则引起的StackOverFlowError问题以及解决方案 | 学步园...

java 正则异常 java.lang.StackOverflowError&#xff1a;在使用正则表达式的时候&#xff0c;底层是通过迭代方式执行的&#xff0c;每一层的迭代都会在栈线程的大小中占一定内存&#xff0c;如果迭代的层次很多&#xff0c;就会报出stackOverFlowError异常。所以在使用正则的…

容斥原理的二进制实现模版

最近学习容斥原理&#xff0c;实现容斥原理大致有三种方法&#xff1a;dfs&#xff0c;队列数组&#xff0c;二进制。 今天主要讲下二进制实现容斥原理&#xff1a; 有一个集合{A1……An}&#xff0c;求集合的子集&#xff1f;很显然答案为 也就是2^n个&#xff0c;也就是每一个…

测试鼠标双击_鼠标环境可靠性测试是什么

鼠标和电脑是的组合&#xff0c;购买电脑时一般商家会送给用户一个配套的鼠标&#xff0c;鼠标和电脑一样&#xff0c;对环境的要求较高&#xff0c;极少部分的鼠标由于短路或者是环境温度过高的问题会导致鼠标出现自燃的现象&#xff0c;如果用户此时正在使用电脑编辑文件&…

snprintf函数用法

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n&#xff0d;1个字符到目标串中&#xff0c;然后再在后面加一个0。所以如果目标串的大小为n 的话&#xff0c;将不会溢出。 函数返回值:若成功则返回欲写入的字符…

virtualbox主机网络管理 未能创建_如何在 VirtualBox 中增加现有虚拟机的磁盘大小 | Linux 中国...

导读&#xff1a;你可以在 VirtualBox 中扩大虚拟硬盘&#xff0c;即使在创建之后也可以。                   本文字数&#xff1a;1434&#xff0c;阅读时长大约&#xff1a;2分钟https://linux.cn/article-12869-1.html作者&#xff1a;Dimitrios Savvopoulos译者…

java 迪米特法则_迪米特法则

文章首发于个人博客 shuyi.tech&#xff0c;欢迎点击原文跳转阅读。 设计模式说白了就是传统经验的总结&#xff0c;它能让我们在合适的场景使用合适的模式&#xff0c;从而加快我们的编程速度&#xff0c;也能提高系统的扩展性、稳定性。这里我想就设计模式提出两个观点&#…

js中的==与===的区别

""&#xff1a; 1&#xff0c;如果两表达式的类型不同&#xff0c;则试图将它们转换为字符串、数字或 Boolean 量。 2&#xff0c;NaN 与包括其本身在内的任何值都不相等。 3&#xff0c;负零等于正零。 4&#xff0c;null 与 null 和 undefined 相等。 5&#x…