2020-10-30

10.30每日一题

463. 岛屿的周长

首先想到的是遍历每一个格子,这样就可以找出所有的陆地格子,接下来要做的就是统计这些陆地格子的周长,格子的周长通过观察可以看到当这个格子的边是边界或者临近的格子是海洋的时候就是周长了,这样找到了判别的条件就可以开始写代码了。

class Solution {
    public int islandPerimeter(int[][] grid) {
        int x = grid.length;
        int y = grid[0].length;
        int sum = 0;
        int[] dx = new int[]{0,1,0,-1};
        int[] dy = new int[]{1,0,-1,0};
        for(int i = 0; i < x; i++){
        	for(int j =0; j < y; j++){
        		if(grid[i][j] == 1){
        			int count = 0;
        			for(int k = 0; k < 4; k++){
        				int rx = i + dx[k];
        				int ry = j + dy[k];
        				if(rx < 0 || rx >= x || ry < 0 || ry >= y || grid[rx][ry] == 0){
        					count++;
        				}
        			}
        			sum = sum + count;
        		}
        	}
        }
        return sum;
    }
}

第二种思路是用dfs的方法,因为是在网格之中,有上下左右四个方向,所以需要搜索四个方向。同时统计周长的方法像上面说的一样,就可以写出代码了。

class Solution {
    public int islandPerimeter(int[][] grid) {
        for(int i = 0; i < grid.length; i++){
        	for(int j = 0; j < grid[0].length; j++){
        		if(grid[i][j] == 1){
        			return dfs(grid, i, j);
        		}
        	}
        }
    }
    int dfs(int[][] grid, int i, int j){
    	if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length){
    		return 1;
    	}
    	if(grid[i][j] == 0){
    		return 1;
    	}
    	if(grid[i][j] != 1){
    		return 0;
    	}
    	grid[i][j] = 2;
    	return dfs(grid, i - 1, j) + 
    			dfs(grid, i + 1, j) + 
    			dfs(grid, i, j - 1) +
    			dfs(grid, i, j + 1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值