给定一个方阵,其中每个单元格都是黑色或白色。设计一个算法来找到最大的子正方形,使得所有 4 个边框都是黑色的。
我有 O(n^2) 算法:
从左到右扫描每一列,对于每一列中的每个单元格,扫描每一行以找到具有后边框的最大子方 block 。
有更好的解决方案吗?
谢谢
最佳答案
O(n^2) 是可能的。我猜这是最佳选择,因为您有 n^2 个单元格。
请注意,任何正方形的左上角和右下角都位于同一条对角线上。
现在如果我们可以在 O(n) 时间内处理每条对角线,我们就会有一个 O(n^2) 时间算法。
假设我们有一个左上角的候选。我们可以计算它下方和右侧的连续黑色单元格的数量,并取两者中的最小值并将其称为 T。
对于右下角的候选,我们可以计算它左边和顶部的连续黑色单元格的数量,并取两者中的最小值,称之为 B。
一旦我们有了 T 和 B 这两个数字,我们就可以判断给定的左上角和右下角的候选是否真的给了我们一个全黑边框的正方形。
现在可以为每个单元格计算这两个数字,在 O(n^2) 时间内通过遍历整个矩阵四次(如何?)。
那么让我们假设这已经完成了。
现在考虑一条对角线。我们的目标是在 O(n) 时间内沿着这条对角线找到左上、右下对。
假设我们在数组 T[1...m] 中计算了 T,其中 m 是对角线的长度。类似地,我们有一个数组 B[1...m]。 T[1] 对应于对角线的左上端,T[m] 对应于右下角。与 B 类似。
现在我们按如下方式处理对角线,对于每个左上候选 i,我们尝试找到一个右下候选 j,它将给出最大的平方。注意 j >= i。另请注意,如果 (i,j) 是候选者,则 (i',j) 不是,其中 i' > i。
请注意,如果 T[i] >= j-i+1 且 B[j] >= j-i+1,则 i 和 j 形成一个正方形。
即T[i] +i - 1 >= j 和 B[j] -j - 1 >= -i。
因此我们形成新的数组,使得 TL[k] = T[k] + k -1 和 BR[k] = B[k] -k - 1.
所以给定两个新数组 TL 和 BR,以及一个 i,我们需要回答以下问题:
What is the largest j such that TL[i] >= j and BR[j] >= -i ?
现在假设我们能够处理范围最大查询的 BR(可以在 O(m) 时间内完成)。
现在给定 TL[i],在 [i, TL[i]] 范围内,我们找到 BR 的最大值,比如 BR[j1]。
现在,如果 BR[j1] >= -i,我们在 [j1, TL[i]] 范围内找到 BR 的最大值,然后继续这种方式。
一旦我们找到 (TL[i],BR[j]) 候选者,我们就可以忽略 future i 的数组 BR[1...j]。
这使我们能够在 O(n) 时间内处理每个对角线,给出 O(n^2) 总算法。
我省略了很多细节并给出了草图,因为它已经太长了。请随时编辑此说明。
呼。
关于c++ - 在方阵中,每个单元格都是黑色或白色。设计一个算法来找到最大子正方形,使得所有 4 个边框都是黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8097377/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“