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:

    解析

    求周长
    给一个矩阵,0表示水,1表示陆地,求小岛的周长

    思路

    还是可以用BFS,或者直接遍历整个矩阵(缺点:矩阵很大陆地很小浪费效率)

    BFS解法

        private int perimeter = 0;
    
        public int islandPerimeter(int[][] grid) {
            if (grid == null || grid.length <= 0 || grid[0] == null || grid[0].length <= 0) {
                return 0;
            }
            ArrayList<Point> isChecked = new ArrayList<>();
            for (int i = 0; i < grid.length * grid[0].length; i++) {
                //找到第一块陆地的位置
                if (grid[i / grid.length][i % grid.length] == 1) {
                    getPerimeter(grid, isChecked, i / grid.length, i % grid.length);
                    break;
                }
            }
            return perimeter;
        }
    
        /**
         * 判断边长递归方法
         * @param grid 矩阵
         * @param isChecked
         *@param i 位置row
         * @param j 位置col   @return 该位置是否陆地
         */
        private boolean getPerimeter(int[][] grid, ArrayList<Point> isChecked, int i, int j) {
            //若i,j是陆地,将它置为0,检测他的四周,是非陆地的边长+1,是陆地的递归getPerimeter
            if (i >= 0 && i < grid.length && j >= 0 && j < grid[0].length && grid[i][j] == 1) {
                if (!isChecked.contains(new Point(i, j))) {
                    isChecked.add(new Point(i, j));
                    if (!getPerimeter(grid, isChecked, i - 1, j)) {
                        perimeter++;
                    }
                    if (!getPerimeter(grid, isChecked, i + 1, j)) {
                        perimeter++;
                    }
                    if (!getPerimeter(grid, isChecked, i, j - 1)) {
                        perimeter++;
                    }
                    if (!getPerimeter(grid, isChecked, i, j + 1)) {
                        perimeter++;
                    }
                }
                return true;
            }
            return false;
        }
    

    直接遍历解法

    public int getPerimeterOther(int[][] grid) {
            int result = 0;
            for (int i = 0; i < grid.length; i++) {
                for (int j = 0; j < grid[0].length; j++) {
                    if (grid[i][j] == 1) {
                        result += 4;
                        if (i > 0 && grid[i - 1][j] == 1) {
                            result -= 2;
                        }
                        if (j > 0 && grid[i][j - 1] == 1) {
                            result -= 2;
                        }
                    }
                }
            }
            return result;
        }
    
  • 相关阅读:
    iOS uiscrollView 嵌套 问题 的解决
    NSURLConnection 网络超时的那些事(转别人整理的)
    IOS 开发中判断NSString是否为空字符
    iOS- SQLite3的基本使用
    怎么应对 domino文档损坏然后损坏文档别删除导致数据丢失
    为什么Log.nsf中存储的日志只有最近7天的原因
    Struts,Spring,Hibernate优缺点
    Java面试之List的三个子类ArrayList,LinkedList,Vector区别
    Java面试之同步/异步/阻塞/非阻塞/BIO/NIO/AIO
    如何设置 Windows 开机启动项
  • 原文地址:https://www.cnblogs.com/shanelau/p/7237827.html
Copyright © 2011-2022 走看看