class Solution {
    public int countPyramids(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int total = 0;
        
        // 正金字塔 (顶部朝上)
        int[][] dp = new int[m][n];
        for (int i = m - 1; i >= 0; i--) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    if (i == m - 1 || j == 0 || j == n - 1) {
                        dp[i][j] = 1;
                    } else {
                        dp[i][j] = 1 + Math.min(dp[i+1][j-1], 
                                        Math.min(dp[i+1][j], dp[i+1][j+1]));
                    }
                    if (dp[i][j] >= 2) {
                        total += dp[i][j] - 1;
                    }
                } else {
                    dp[i][j] = 0;
                }
            }
        }
        
        // 倒金字塔 (顶部朝下)
        int[][] dp2 = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    if (i == 0 || j == 0 || j == n - 1) {
                        dp2[i][j] = 1;
                    } else {
                        dp2[i][j] = 1 + Math.min(dp2[i-1][j-1],
                                        Math.min(dp2[i-1][j], dp2[i-1][j+1]));
                    }
                    if (dp2[i][j] >= 2) {
                        total += dp2[i][j] - 1;
                    }
                } else {
                    dp2[i][j] = 0;
                }
            }
        }
        
        return total;
    }
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐