LeetCode 463: Island Perimeter(岛屿周长)

问题描述:

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.
输入一个矩阵,1代表陆地,0代表湖泊,求岛屿周长。

Example:



思路一:

分别从上到下,从左到右,若相邻两个方块为不同属性(即一个为陆地,一个为湖泊)时,岛屿周长加1。主要边界值的处理,边界的四周均设为0即湖泊。使用异或^操作。

Code:

class Solution {
public:
    int islandPerimeter(vector<vector<int>>& grid) {
        int perimeter=0;
        for(int i = 0; i<grid.size();i++){
            int left=0;
            for(int j=0; j<grid[0].size();j++){
                if(left^grid[i][j]) perimeter++;
                left = grid[i][j];
            }
            if(left^0) perimeter++;
        }
        for(int i = 0; i<grid[0].size();i++){
            int left=0;
            for(int j=0; j<grid.size();j++){
                if(left^grid[j][i]) perimeter++;
                left = grid[j][i];
            }
            if(left^0) perimeter++;
        }
        return perimeter;
    }
};

思路二:

若不考虑陆地相邻,每块陆地的周长为4,则岛屿周长为:陆地块数*4。考虑到陆地相邻,则每两块相邻陆地使得岛屿周长减2。遍历矩阵,统计值为1的元素即陆地块数,并查找每块陆地的左边和上边是否为陆地,若是陆地,则周长减2。注意边界值的处理。

Code:

int islandPerimeter(vector<vector<int>>& grid) {
        int count=0, repeat=0;
        for(int i=0;i<grid.size();i++)
        {
            for(int j=0; j<grid[i].size();j++)
                {
                    if(grid[i][j]==1)
                    {
                        count ++;
                        if(i!=0 && grid[i-1][j] == 1) repeat++;
                        if(j!=0 && grid[i][j-1] == 1) repeat++;
                    }
                }
        }
        return 4*count-repeat*2;
    }




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值