题目描述

给定一个由0和1组成的2维矩阵,返回该矩阵中最大的由1组成的正方形的面积

示例1

输入

[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]

返回值

4
import java.util.HashMap;public class SquareMe {public static void main(String[] args) {char [] [] matrix = {{'1','0','1','0','0'},{'0','0','1','1','1'},{'1','0','1','1','1'},{'0','0','0','0','0'},{'1','0','0','1','0'}};SquareMe squareMe = new SquareMe();System.out.println(squareMe.solve(matrix));}//在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。//暴力求解public int find_maximalSquare(char[][]matrix){int maxSide = 0;if (matrix==null || matrix.length==0|| matrix[0].length==0){return maxSide;}int rows = matrix.length;int cols = matrix[0].length;for (int i = 0; i <rows ; i++) {for (int j = 0; j <cols ; j++) {if (matrix[i][j]=='1'){maxSide = Math.max(maxSide,1);//计算可能的最大正方形边长int currentMaxSide = Math.min(rows-i,cols-j);for (int k = 1; k <currentMaxSide ; k++) {//判断新增一行一列是否均为1boolean flag = true;// 如果对角的点不是1,那就形成不了一个正方形if (matrix[i+k][j+k] == '0'){break;}// 如果对角的点是1, 那么再判断边上的点是不是1,如果是1,那么就能组成一个正方形for (int m = 0; m <k ; m++) {if (matrix[i+k][j+m]=='0' || matrix[i+m][j+k]=='0'){flag = false;break;}}if (flag){maxSide = Math.max(maxSide,k+1);}else {break;}}}}}return maxSide* maxSide;}/**** [1,0,1,0,0]* [1,0,1,1,1]* [1,1,1,1,1]* [1,0,0,1,0]** 动态规划** 最大正方形* @param matrix char字符型二维数组* @return int整型*/public int solve (char[][] matrix) {int maxSide=0;if (matrix==null || matrix.length==0||matrix[0].length==0){return maxSide;}int rows = matrix.length,cols=matrix[0].length;int [][]dp=new int[rows][cols];for (int i = 0; i <rows ; i++) {for (int j = 0; j <cols ; j++) {if (matrix[i][j] =='1'){// 动态规划 每次是1,就记录下此时的状态,以便下次使用if (i==0 || j==0){dp[i][j]=1;}else {dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;}maxSide = Math.max(maxSide,dp[i][j]);}}}return maxSide*maxSide;}
}

常考数据结构与算法:最大正方形相关推荐

  1. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  2. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  3. 常考数据结构与算法:删除链表的倒数第n个节点

    题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...

  4. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

  5. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  6. 常考数据结构与算法:两个链表生成相加链表

    题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 例如:链表 1 为 9->3->7,链表 ...

  7. 常考数据结构与算法:买卖股票的最好时机

    题目描述 假设你有一个数组,其中第 i 个元素是股票在第i 天的价格. 你有一次买入和卖出的机会.(只有买入了股票以后才能卖出).请你设计一个算法来计算可以获得的最大收益. 示例 1: 输入: [8, ...

  8. 常考数据结构和算法:设计LRU缓存结构

    题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的val ...

  9. 常考数据结构与算法:每k个节点反转链表

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

最新文章

  1. 【怎样写代码】向现有类型“添加”方法 -- 扩展方法(四):在编译时绑定扩展方法的规则
  2. oracle 孟硕_关于几大主机厂的阿里云论坛用户知识和技术交流
  3. WPF里ItemsControl的分组实现
  4. java笔记数组小知识点
  5. mssql 字增自段怎样重置(重新自增)|清空表已有数据
  6. 程序员浪漫起来到底有多可怕!
  7. ElasticSearch启动报错at least one of [discovery.seed_hosts, discovery.seed_provid---ElasticSearch工作笔记032
  8. 读书节第四日丨技术书单随心Pick,学院好课0元学
  9. 【优化算法】麻雀搜索优化算法(SSA)【含Matlab源码 1288期】
  10. git、KDiff3、Git Extensions
  11. FileZilla 无法连接服务器 fzSftp started, protocol_version=11
  12. 经典歌曲多版本欣赏:刘欢《情怨》:华夏元素鲜明的“中国风格“
  13. 前端进行身份证验证(详细)
  14. WiFi大师小程序3.0.9独立版源码
  15. 阿里云OSS对象存储
  16. 【面试时最令职场面试官讨厌的十种行为】
  17. 安装时间大于30秒_30个住宅室内消防设置检验要点!硬核干货!
  18. Android 短信 彩信 wap push的接收
  19. ai不同形状的拼版插件_Illustrator(AI)自动拼版脚本 V1.5下载(编组对象的复制位移)...
  20. 在 Docker 中设置时区

热门文章

  1. 软件测试相关好文收集
  2. 学会四招让你在linux下安装程序变得简单
  3. HTTPS Web配置举例
  4. Everyday English
  5. movsb movsw movsd 指令详解
  6. ASCII 编码对照表
  7. Vue踩坑之旅(一)—— 数组、对象的监听
  8. 设计模式-创建型模式-建造者模式
  9. EIGRP协议邻居详解及故障实战分析
  10. 新书预告:《Linux 多线程服务端编程——使用 muduo C++ 网络库》