您的位置:首页 > 其它

【LeetCode】Island Perimeter 解题报告

2017-01-06 16:30 288 查看

【LeetCode】Island Perimeter 解题报告

[LeetCode]

https://leetcode.com/problems/island-perimeter/

Total Accepted: 16143

Total Submissions: 28552

Difficulty: Easy

Question

You are given a map in form of a two-dimensional integer grid where 1

represents land and 0 represents water. Grid cells are connected

horizontally/vertically (not diagonally). The grid is completely

surrounded by water, and there is exactly one island (i.e., one or

more connected land cells). The island doesn’t have “lakes” (water

inside that isn’t connected to the water around the island). One cell

is a square with side length 1. The grid is rectangular, width and

height don’t exceed 100. Determine the perimeter of the island.

Example:

[[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]]

Answer: 16 Explanation: The perimeter is the 16 yellow stripes in the

image below:



Ways

有点类似小学火柴棍的问题。我最初的想法是统计一的个数,找规律,试验了几次之后发现貌似是1的个数*2+2,但是这个是错误的。比如最角落的1如果被周围的1所包围的话,实际上是不贡献边的。

后来想到,应该把边角的被包围的1去掉,中间的被四个1包围的1也给去掉,剩余的1的个数*4.这样很麻烦,因为判断处于边角位置的1就要写4个If,判断被包围的1也要判断四次。

看到top的答案我才明白,可以统计1的个数*4 再减去 与其有交集的1的个数*2.为了防止减去的边不被重复计算,所以,只判断右边和下边的1.代码如下。

public class Solution {
public int islandPerimeter(int[][] grid) {
int count=0;
int neighbours=0;
for(int i=0; i<grid.length; i++){
for(int j=0 ;j<grid[i].length; j++){
if(grid[i][j]==1){
count++;// count islands
if(j<grid[i].length-1 && grid[i][j+1]==1)
neighbours++;// count right neighbours
if(i<grid.length-1 && grid[i+1][j]==1)
neighbours++;// count down neighbours
}
}
}
return 4*count-2*neighbours;
}
}


果然这种方法判断的次数要少一点。

Date

2017 年 1 月 6 日
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode