常考数据结构与算法:最大正方形
生活随笔
收集整理的這篇文章主要介紹了
常考数据结构与算法:最大正方形
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
給定一個由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;} }?
總結
以上是生活随笔為你收集整理的常考数据结构与算法:最大正方形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常考数据结构与算法:进制转换
- 下一篇: 常考数据结构与算法:设计getMin功能