首页 > 代码库 > leetcode 463

leetcode 463

题目描述:

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:

技术分享

 

 

 解题思路分析:

就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的边的数目即可。在查找重叠的边的数目的时候有一点小技巧,就是沿着其中两个方向就好,这种题目都有类似的规律,就是可以沿着上三角或者下三角形的方向来做。

 

一点感受:

题目非常简单,可是我为什么我还要把这个题目放到博客上呢?原因在于这是我第一次尝试直接在白板leetcode的白板上写代码,而且一次通过,算是开了个好头吧,以后不管是简单题还是难题,我都会写博客,以后面试的时候一定会用到。

如果编程语言用的比较熟,白板写代码的效果和IDE上写没太大区别。

 

class Solution {
public:
    int islandPerimeter(vector<vector<int>>& grid) {
        int res = 0, overlap = 0;
        for (int i = 0; i < grid.size(); i ++)
        {
            for (int j = 0; j < grid[i].size(); j ++)
            {
                if (grid[i][j] == 1)
                {
                    res ++;
                    if (j + 1 < grid[i].size() && grid[i][j + 1] == 1)
                        overlap ++;
                    if (i + 1 < grid.size() && grid[i + 1][j] == 1)
                        overlap ++;
                }
            }
        }
        
        return res * 4 - 2 * overlap;
        
    }
};

 

ps:代码风格可能还有点问题,接下来会好好改进的,毕竟程序员(工程师)是一种严谨的职业!

 

 

 

leetcode 463