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.

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:
我写了一大堆 然后发现自己的for循环写的太复杂了 下面有一种简便的写法
public class Solution {
    public int islandPerimeter(int[][] grid) {
        if(grid==null || grid.length==0) return 0;
        int perimeter = 0;
        int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
        for(int i=0; i<grid.length; i++){
            for(int j=0; j<grid[0].length; j++){
                if(grid[i][j]==1){
                    for(int[] dir : dirs){//这个地方使用了简便的for循环 要注意这种写法 dir是一维数组 在循环的过程中分别被赋值为
{-1,0},{1,0},{0,-1},{0,1}
int xx = i+dir[0], yy = j+dir[1]; if(xx<0 || yy<0 || xx>=grid.length || yy>=grid[0].length || grid[xx][yy]==0) perimeter++; //border or water } } } } return perimeter; }}




另外这里有一个dfs的写法
    public int islandPerimeter(int[][] grid) {
        if(grid==null || grid.length==0) return 0;
        int perimeter = 0;
        for(int i=0; i<grid.length; i++){
            for(int j=0; j<grid[0].length; j++){
                if(grid[i][j]==1){
                    perimeter = dfs(i, j, grid);//这里的dfs函数就是用来计算一个小方块的边长
                    break;
                }
            }
        }
        return perimeter;
    }
    int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
    private int dfs(int x, int y, int[][] grid){
    	grid[x][y] = 2;//这里巧妙用了一个flag
        int count = 0;
        for(int[] dir : dirs){
            int xx = x+dir[0];
            int yy = y+dir[1];
            if(xx<0 || yy<0 || xx>=grid.length || yy>=grid[0].length || grid[xx][yy]==0) {
                count++; //border or water
            } else if(grid[xx][yy]==1){ // 如果上面的情况都不是 说明当前island的旁边的xx,yy是一块没有遍历的陆地,于是进入递归
                count += dfs(xx, yy, grid);
            }
        }
        return count;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值