链接

求解

1、暴力法

2、动态规划 DP

  1. /**
  2. * 方法二:动态规划
  3. * DP
  4. */
  5. class Solution2 {
  6. public int maximalSquare(char[][] matrix) {
  7. int rows = matrix.length, cols = rows > 0 ? matrix[0].length : 0;
  8. // 维数与原矩阵一致 dp[i][j]表示的是由当前元素作为边长时,组成的最大正方形的边长
  9. int[][] dp = new int[rows + 1][cols + 1];
  10. int maxsqlen = 0;
  11. for (int i = 1; i <= rows; i++) {
  12. for (int j = 1; j <= cols; j++) {
  13. if (matrix[i-1][j-1] == '1'){
  14. dp[i][j] = Math.min(Math.min(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1;
  15. maxsqlen = Math.max(dp[i][j],maxsqlen);
  16. }
  17. }
  18. }
  19. return maxsqlen * maxsqlen;
  20. }
  21. public static void main(String[] args) {
  22. // 4
  23. System.out.println((new Solution2()).maximalSquare(new char[][]{{'1', '0', '1', '0', '0'}, {'1', '0', '1', '1', '1'}, {'1', '1', '1', '1', '1'}, {'1', '0', '0', '1', '0'}}));
  24. //9
  25. System.out.println((new Solution2()).maximalSquare(new char[][]{{'0','0','0','1'}, {'1','1','0','1'}, {'1','1','1','1'}, {'0','1','1','1'}, {'0','1','1','1'}}));
  26. }
  27. }