问题描述:
思路: 按道理每个实心格子会贡献4条边长,但是如果格子周围如果有别的实心格子,就会少贡献一条,最坏的情况是四周都被包围,就贡献0边长。所以总边长=SumOver_i(实心格子i*4-实心格子i周围实心格子数量)
代码如下:
其中使用了((i-1<0)?0:1*grid[i-1][j])
保证遍历时不超出边界
import java.util.HashMap;
public class IslandPerimeter {
public int islandPerimeter(int[][] grid) {
HashMap<Integer,int[]>h=new HashMap<Integer,int[]>();
int[]temp;
int sum=0;
int idx=0,nextNum=0,m=grid.length,n=grid[0].length;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
nextNum=((i-1<0)?0:1*grid[i-1][j])+
((j-1<0)?0:1*grid[i][j-1])+((j+1>n-1)?0:grid[i][j+1])+
((i+1>m-1)?0:grid[i+1][j]);
temp=new int[2];
temp[0]=grid[i][j];
temp[1]=nextNum;
h.put(idx,temp);
idx++;
}
}
for(int i:h.keySet()){
if(h.get(i)[0]==1)
sum+=h.get(i)[0]*4-h.get(i)[1];
}
return sum;
}
public static void main(String[]args){
IslandPerimeter c=new IslandPerimeter();
int[][]grid={{1},{0}};
// ={{0,1,0,0},
// {1,1,1,0},
// {0,1,0,0},
// {1,1,0,0}};
System.out.println(c.islandPerimeter(grid));
}
}