[892]三次元体表面積


リンク

タイトル説明

ここに画像を挿入説明

思考

すべての計算正方体的总个数、こと全表面積6 * 总个数
それぞれが表面一致を有するが、表面積が減少する2
嵌合面を見つけるために再び。

  • 格子の同じ数> 2のキューブに存在する、多数の重複表面= --1
  • 左右重合
  • 上下重合
class Solution {
    public int surfaceArea(int[][] grid) {
        if(grid == null || grid.length == 0){
            return 0;
        }
        int coincide = 0;
        int sumNum = 0;
        for(int i = 0 ; i < grid.length ;i++){
            for(int j = 0; j < grid[0].length ; j++){
            	//左右重合
                if(j < grid[0].length-1){
                    coincide += Math.min(grid[i][j],grid[i][j+1]);
                }
                //上下重合
                if(i < grid.length-1 ){
                    coincide += Math.min(grid[i][j],grid[i+1][j]);
                }
                //同一个格子上重合
                if(grid[i][j] > 1){
                    coincide += grid[i][j]-1;
                }
                sumNum += grid[i][j];
            }
        }
        return 6*sumNum - 2*coincide;
    }
}

より簡潔な言葉遣い、使用ビット・コンピューティング

換算で気筒毎に各立方体の上下両面四の側面の表面積
の重なりを減算することができます

class Solution {
    public int surfaceArea(int[][] grid) {
        if(grid == null || grid.length == 0){
            return 0;
        }
        int n = grid.length;
        int area = 0;
        for(int i = 0; i < n;i++){
            for(int j = 0; j < n;j++){
                int level = grid[i][j];
                if(level > 0){
                    area += (level << 2) + 2;
                    area -= i > 0 ? ((Math.min(level,grid[i-1][j])) << 1) : 0;
                    area -= j > 0 ? ((Math.min(level,grid[i][j-1])) << 1) : 0;
                }
            }
        }
        return area;
    }
}
公開された55元の記事 ウォンの賞賛1 ビュー863

おすすめ

転載: blog.csdn.net/weixin_42469108/article/details/105112192