解法一:动态规划

考虑 N 维子矩阵时,dp[N][i][j] 表示以元素 (i,j) 为左上角,边长为 N 的子矩阵内部是否全为1。
考察满足条件的 N 维矩阵时,不需要考察每一个元素,只需要考察相邻的4个满足条件的 N-1 维矩阵即可,动规方程方程如下:
1277. 统计全为 1 的正方形子矩阵 - 图1

  1. class Solution {
  2. public int countSquares(int[][] matrix) {
  3. final int row = matrix.length;
  4. final int col = matrix[0].length;
  5. int ans = 0;
  6. for (int i = 0; i < row; ++i) {
  7. for (int j = 0; j < col; ++j) {
  8. if (matrix[i][j] > 0) {
  9. ++ans;
  10. }
  11. }
  12. }
  13. for (int k = 1; k < Math.min(row, col); ++k) {
  14. for (int i = 0; i < row - k; ++i) {
  15. for (int j = 0; j < col - k; ++j) {
  16. matrix[i][j] = matrix[i][j] & matrix[i + 1][j] & matrix[i][j + 1] & matrix[i + 1][j + 1];
  17. if (matrix[i][j] > 0) {
  18. ++ans;
  19. }
  20. }
  21. }
  22. }
  23. return ans;
  24. }
  25. }

解法二:动态规划

参考官方题解:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/solution/

  1. class Solution {
  2. public int countSquares(int[][] matrix) {
  3. final int row = matrix.length;
  4. final int col = matrix[0].length;
  5. int[][] dp = new int[row][col];
  6. int ans = 0;
  7. for (int i = 0; i < row; ++i) {
  8. for (int j = 0; j < col; ++j) {
  9. if (matrix[i][j] == 0) {
  10. dp[i][j] = 0;
  11. } else if ((i == 0) || (j == 0)) {
  12. dp[i][j] = matrix[i][j];
  13. } else {
  14. dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
  15. }
  16. ans += dp[i][j];
  17. }
  18. }
  19. return ans;
  20. }
  21. }