题目

  给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。 
  例如: 
  0 1 1 1 1 
  0 1 0 0 1 
  0 1 0 0 1 
  0 1 0 1 1 
  其中,边框全是1的最大正方形的大小是4*4,返回4。

基本思路

 比较容易理解的方法:

矩阵中一共有N*N个位置。O(N2N2)

每一个位置都可以成为边长为N~1的正方形的左上角。O(N)

如何检查一个位置是否可以成为边长为N的正方形的左上角呢?遍历这个边长为N的正方形边界看是否只由1构成,也就是走过4个边的长度(4N)。O(N)

所以总的时间复杂度O(N4N4).

  该方法可以进行优化,将步骤三的时间复杂度降为O(1),总的时间复杂度降为O(N3N3)。思路就是通过预处理,得到两个辅助矩阵right、down。right[i][j]的含义是,从位置(i,j)开始,向右一共有多少个连续的1;down[i][j]的含义是,从位置(i,j)开始,向下一共有多少个连续的1。利用动态规划很容易得到这两个辅助矩阵。

  接下来,如何检查一个位置是否可以成为边长为N的正方形的左上角呢?只要判断边框左上角的位置向右以及向下连续的1的个数是否大于N,以及边框左下角的位置向右连续的1的个数是否大于N、以及边框右上角的位置向下连续的1的个数是否大于N。

def getMaxSize(matrix):if matrix == None or len(matrix) == 0:return 0right = [[0 for i in range(len(matrix[0]))] for j in range(len(matrix))]down = [[0 for i in range(len(matrix[0]))] for j in range(len(matrix))]setBorderMap(matrix,right,down)size_result = []for size in range(min(len(matrix),len(matrix[0])),0,-1):if hasSizeOfBorder(size,right,down):size_result.append(size)if len(size_result)==0:return 0else:return max(size_result)def setBorderMap(matrix,right,down):row = len(matrix) - 1col = len(matrix[0]) - 1if matrix[row][col] == 1:right[row][col] = 1down[row][col] = 1for i in range(len(matrix)-2,-1,-1):if matrix[i][col] == 1:right[i][col] = 1down[i][col] = down[i+1][col] + 1for j in range(len(matrix[0])-2,-1,-1):if matrix[row][j] == 1:right[row][j] = right[row][j+1] + 1down[row][j] = 1for i in range(len(matrix)-2,-1,-1):for j in range(len(matrix[0])-2,-1,-1):if matrix[i][j] == 1:right[i][j] = right[i][j+1] + 1down[i][j] = down[i+1][j] + 1def hasSizeOfBorder(size,right,down):for i in range(len(right)-size+1):for j in range(len(right[0])-size+1):if right[i][j] >= size  and down[i][j] >= size and right[i+size-1][j] >= size and down[i][j+size-1]>=size:return Truereturn Falsematrix = [[0,1,1,1,1],[0,1,0,0,1],[0,1,0,0,1],[0,1,1,1,1],[0,1,0,1,1]]
getMaxSize(matrix)

边界都是1的最大正方形大小相关推荐

  1. 苹果手机看python文件大小_Python练习题:你有一个目录,装了很多照片,把它们的尺寸变成都不大于iPhone5分辨率的大小...

    第 0005 题:你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小. Answer: 分析题目,一个是对图片文件的操作,更改尺寸为1130*640 还有一个是遍历目录 ...

  2. 判断边界由1组成的最大正方形面积

    问题 假如输入一个全是一和零的二维数组,请输出由一组成边界的最大正方形面积. 示例 输入 1,1,1,1 1,0,1,1 1,1,1,1 输出 9 思想 动态规划,一个位置它是不是边界和他的右边和下边 ...

  3. 你想学的都在这里!java开发工程师简历自我评价

    栈和队列部分(10) 设计一个有getMin功能的栈(士★☆☆☆) 由两个栈组成的队列(尉★★☆☆) 如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 猫狗队列(士★☆☆☆) 用一个栈实现另一个栈的排 ...

  4. 《程序员代码面试指南第二版》Python实现(个人读书笔记)

    说明 最近在读左神的书---<程序员代码面试指南-IT名企算法与数据结构题目最优解(第二版)>以及看了一些左神的基础.进阶.高频等视频课程,为了记录自己的学习成果,并且方便以后查看,将自己 ...

  5. 大牛深入讲解!最经典的HashMap图文详解

    栈和队列部分(10) 设计一个有getMin功能的栈(士★☆☆☆) 由两个栈组成的队列(尉★★☆☆) 如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 猫狗队列(士★☆☆☆) 用一个栈实现另一个栈的排 ...

  6. 两个矩阵是否相交的算法_算法血拼:Google+百度+Alibaba+字节+Tencent+网易+360+拼夕夕...

    最热的三伏天来了,相信有许多小伙伴们都已马不停蹄的在准备各大厂的秋招提前批了吧,不知算法与数据结构会不会成为你的坎? 恰好,我这两天花了点时间,整理了些各大厂(Google+百度+Alibaba+字节 ...

  7. 来来来!统一命名服务、集群管理、分布式应用

    栈和队列部分(10) 设计一个有getMin功能的栈(士★☆☆☆) 由两个栈组成的队列(尉★★☆☆) 如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 猫狗队列(士★☆☆☆) 用一个栈实现另一个栈的排 ...

  8. 看完这篇,java遍历字符串列表

    今年互联网形式依旧严峻,再次爆发几次大规模裁员潮.我决定把这篇文章分享出来帮助那些对前途感到迷茫的朋友. 在猎头的眼里,我已不是根正苗红的程序员.何为根正苗红?计算机专业毕业,从毕业起就从事特定方向的 ...

  9. 【2021Java最新学习路线】java后端开发入门

    前言 消息中间件作为分布式系统的重要成员,各大公司及开源均有许多解决方案.目前主流的开源解决方案包括RabbitMQ.RocketMQ.Kafka.ActiveMQ等.消息这个东西说简单也简单,说难也 ...

最新文章

  1. LeetCode 122. Best Time to Buy and Sell Stock II--贪心--Java,C++,Python解法
  2. HTTP API 自动化测试从手工测试到平台的演变
  3. k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常)
  4. camerax 自动聚焦_Android实现手机摄像头的自动对焦
  5. GitHub 项目 增加成员
  6. 计算机开机跳过硬盘检查,电脑开机后如何跳过磁盘检查过程?
  7. ceph Luminous版手动安装零散记录
  8. Qt工作笔记-第一个QML(QQuickView显示QML文件)
  9. python 小提高
  10. android分享数据到不同平台组件化
  11. trend函数用oracle实现,使用TREND函数和LINEST函数做销售预测或成本分析
  12. 幼儿计算机教材有哪些,中华字经幼儿教材
  13. Java考试常考基础题(Examination Questions Parsing01)
  14. php学习笔记——PHP 概述
  15. 一个非教条式的TDD例子
  16. 【洛谷1489】猫狗大战【BZOJ1899】【ZJOI2004】Lunch午餐
  17. android串口开发!一年后斩获腾讯T3,附面试题答案
  18. 利用批处理添加受信任站点
  19. 【ESP8266个人学习笔记】二、自动控制系统的输入输出信号
  20. 使用vscode remote ssh功能远程连接服务器或树莓派时,报错Setting up SSH tunnel的终极解决办法,全网仅此一份

热门文章

  1. 算法与数据结构之二分查找
  2. 安全操作中心之于SDN
  3. Cascading(一)之日志解析
  4. Linux使用dd命令快速生成大文件
  5. 内存分配函数 malloc、realloc、calloc
  6. PAT甲级1052 Linked List Sorting:[C++题解]链表排序
  7. android user-agent iso-8859-1,微信网页授权,错误40163,ios正确,安卓错误?
  8. Python后端转JAVA最快多久_PHP多久能学会?比java,python难还是简单呢?
  9. 华为手机怎么看图片属性_如果不能用联发科芯片,华为手机该怎么办,有一招就看华为用不用...
  10. origin使用指导。pdf_LabPlot替代Origin用于科研绘图