zoukankan      html  css  js  c++  java
  • [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:
    

    给一个二维的格子图,格子是1表示陆地,0表示水,格子水平或者垂直连接,若干的格子连在一起形成一个小岛,只有一个相连的岛,且岛中没有湖,求岛的周长。 

    解法1: 遇到为1的格子,检验四个方向是否和陆地相连

    解法2: 遇到为1的格子,检查上面和左面是否和陆地相连

    Java:

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

    Python:

    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        ans = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 1:
                    ans += 4
                    if i > 0 and grid[i-1][j] == 1:
                        ans -= 2
                    if j > 0 and grid[i][j-1] == 1:
                        ans -= 2
        return ans  

    Python:

    class Solution(object):
        def islandPerimeter(self, grid):
            """
            :type grid: List[List[int]]
            :rtype: int
            """
            if not grid:
                return 0
    
            def sum_adjacent(i, j):
                adjacent = (i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1),
                res = 0
                for x, y in adjacent:
                    if x < 0 or y < 0 or x == len(grid) or y == len(grid[0]) or grid[x][y] == 0:
                        res += 1
                return res
    
            count = 0
            for i in range(len(grid)):
                for j in range(len(grid[0])):
                    if grid[i][j] == 1:
                        count += sum_adjacent(i, j)
            return count  

    Python:

    class Solution:
        def islandPerimeter(self, grid):
            if not grid:
                return 0
    
            N = len(grid)
            M = len(grid[0])
            ans = 0
            for i in range(N):
                for j in range(M):
                    for k in [(-1, 0), (0, 1), (1, 0), (0, -1)]:
                        if i+k[0] < 0 or i + k[0] >= N or j+k[1] < 0 or j+k[1] >= M or grid[i+k[0]][j+k[1]] == 0:
                            ans += 1
            return ans  

    C++:

    class Solution {
    public:
        int islandPerimeter(vector<vector<int>>& grid) {
            if (grid.empty() || grid[0].empty()) return 0;
            int m = grid.size(), n = grid[0].size(), res = 0;
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (grid[i][j] == 0) continue;
                    if (j == 0 || grid[i][j - 1] == 0) ++res;
                    if (i == 0 || grid[i - 1][j] == 0) ++res;
                    if (j == n - 1 || grid[i][j + 1] == 0) ++res;
                    if (i == m - 1 || grid[i + 1][j] == 0) ++res;
                }
            }
            return res;
        }
    };
    

    C++:

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

      

    Followup: 如果不止一个岛屿  

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    Netcat实用操作
    Golang的面向对象实践method
    将大数组里面的小数组平行展开的实现(Making a flat list out of list of lists in Python)
    bootstrap table表格加载本地数据
    扎职扎职扎职扎职扎职扎职扎职扎职扎职扎职扎职
    java使用poi导出excel防止数字变成科学计数法的形式
    element-ui中搜索框回车刷新页面问题的解决方法
    范式建模的理解
    svn去除java编译后文件配置
    java中使用sublist方法获取list集合的前1000条数据
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9711103.html
Copyright © 2011-2022 走看看