岛屿

LeetCode 695. 岛屿的最大面积 (DFS)

僤鯓⒐⒋嵵緔 提交于 2020-03-16 09:07:24
题目链接: https://leetcode-cn.com/problems/max-area-of-island/ 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) 示例 1: [[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] 对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 示例 2: [[0,0,0,0,0,0,0,0]] 对于上面这个给定的矩阵, 返回 0。 注意: 给定的矩阵grid 的长度和宽度都不超过 50。 1 int dx[4]={1,-1,0,0}; 2 int dy[4]={0,0,1,-1}; 3

LeetCode 695. 岛屿的最大面积

情到浓时终转凉″ 提交于 2020-03-15 20:52:51
695. 岛屿的最大面积 难度 中等 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) 示例 1: [[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] 对于上面这个给定矩阵应返回 6 。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 示例 2: [[0,0,0,0,0,0,0,0]] 对于上面这个给定的矩阵, 返回 0 。 注意: 给定的矩阵 grid 的长度和宽度都不超过 50。 解题思路:遍历二维数组并且搜索岛屿,搜索到岛屿后将其代入函数,使用递归,将岛屿上下左右都进行搜索,并且,将已经搜索过的岛屿覆盖复制,最后返回岛屿面积,与最大面积对比

200. 岛屿数量

你说的曾经没有我的故事 提交于 2020-02-22 14:56:07
200. 岛屿数量 给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 示例 1: 输入: 11110 11010 11000 00000 输出: 1 示例 2: 输入: 11000 11000 00100 00011 输出: 3   这道题与 面试题 16.19. 水域大小 思路相同,同样是使用深度优先搜索,遇到 ‘1’ 就使岛屿数量加一,然后将其周围的 ‘1’ 都变成 ‘0’ ,继续搜索其余部分,最后返回结果即可。 这道题需要注意一下 vector 里存的是 char ,不要当成 int 去判断 0 或 1 了。 class Solution { public : int numIslands ( vector < vector < char >> & grid ) { int res = 0 ; for ( int i = 0 ; i < grid . size ( ) ; i ++ ) { for ( int j = 0 ; j < grid [ 0 ] . size ( ) ; j ++ ) { if ( grid [ i ] [ j ] == '1' ) { ++ res ; spare ( grid , i , j ) ; } } }

695. 岛屿的最大面积

99封情书 提交于 2020-02-05 15:08:41
695. 岛屿的最大面积 1.题目描述 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) 示例 1: 对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 示例 2: 对于上面这个给定的矩阵, 返回 0。 注意: 给定的矩阵grid 的长度和宽度都不超过 50。 2.思路(DFS) 1.求出每个连通形状的面积,然后取最大值。 2.在一个土地上,以 4 个方向探索与之相连的每一个土地(以及与这些土地相连的土地,等等),那么所探索的土地总数将是该相连形状的面积。 3.为了确保每个土地访问不超过一次,设置grid[i][j] = 0。它也会阻止我们多次计算同一土地。 3.代码 class Solution { public : int DFS ( vector < vector < int >> & grid , int r , int c ) { if ( r >= grid . size ( ) || r < 0 ) { return 0 ; } if ( c >= grid [ 0 ] . size ( ) || c < 0 ) {

POJ 1328 Radar Installation【贪心】

不打扰是莪最后的温柔 提交于 2020-02-04 01:15:12
POJ 1328 题意: 将一条海岸线看成X轴,X轴上面是大海,海上有若干岛屿,给出雷达的覆盖半径和岛屿的位置,要求在海岸线上建雷达,在雷达能够覆盖全部岛屿情况下,求雷达的最少使用量。 分析: 贪心法,先研究一下每个岛屿,设岛屿到海岸线的垂直距离为d,雷达的覆盖半径为k,若d>k,直接输出-1,若d<=k,则雷达的建造有一个活动区间[x1,x2](用平面几何可以求得出来)。因此,在可以覆盖的情况下每个岛屿都有一个相应的活动区间。该问题也就转变成了最少区间选择问题即: 在n个区间中选择一个区间集合,集合中的各个区间都不相交,集合中元素的个数就是答案了。 #include <iostream> #include <algorithm> #include <stdlib.h> #include <math.h> #include <stdio.h> using namespace std; struct point { double left, right; }p[2010], temp; bool operator < (point a, point b) { return a.left < b.left; } int main() { int n; double r; int kase = 0; while(true) { scanf("%d%lf",&n,&r); if(n==0&

《LeetCode笔记1》:岛屿数量

会有一股神秘感。 提交于 2020-02-01 08:48:35
题目 给定一个由 '1' (陆地)和 '0' (水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 示例1: 输入: 11110 11010 11000 00000 输出: 1 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/number-of-islands 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解法一: BFS BFS用的是队列。(速度慢) 1. 遍历整块大陆,横着竖着遍历都可以。 2.第一次碰到陆地的时候,就知道这是块岛屿了,所以将这块陆地放入探险队列,岛屿数量加一。 3.然后我们将这块岛屿的陆地探索完。每一次将这块陆地周围(上下左右)的陆地放入队列,然后将这块陆地标记为已探索(这里就直接置为'0'了)。 4.当探险队列为空时,表示这块岛屿的陆地全部被探索完了,我们继续寻找下一块陆地。 (原文链接:https://blog.csdn.net/dongmuyang/article/details/94408324) 解法二: DFS(栈+递归)(速度快) 1.遍历整块大陆。 2.当遇到为‘1’的点时,以该点为起点进行四邻域深度优先遍历,将遍历到的点都置为‘0’。其为1个岛屿。 3.继续寻找下一块陆地

floodfill问题——岛屿的最大面积

南楼画角 提交于 2020-01-26 03:51:12
文章目录 floodfill问题——岛屿的最大面积 问题描述 思路 代码 扩展 floodfill问题——岛屿的最大面积 问题描述 题目来自Leetcode695题 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) 示例 1: [[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] 对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 示例 2: [[0,0,0,0,0,0,0,0]] 对于上面这个给定的矩阵, 返回 0。 注意: 给定的矩阵grid 的长度和宽度都不超过 50。 思路 对于这类问题,都是基于以下思路,遍历二维数组

463-岛屿的周长

旧时模样 提交于 2020-01-19 19:27:06
463-岛屿的周长 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。 网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。 岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 示例 : 输入: [[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] 输出: 16 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/island-perimeter 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 public int islandPerimeter(int[][] grid) { // 1的个数*4 - 1相邻的个数*2 int cnt = 0; int adj = 0; for(int i = 0; i < grid.length; i++) { for(int j = 0; j < grid[i].length; j++) { if(grid[i][j] == 1) { cnt++; if(i < grid.length - 1 &&

leetcode 200. 岛屿数量 golang实现

爱⌒轻易说出口 提交于 2020-01-15 01:05:40
描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 示例 1: 输入: 11110 11010 11000 00000 输出: 1 示例 2: 输入: 11000 11000 00100 00011 输出: 3 思路 深度优先遍历 每次遇到=1的地方 岛屿数+1 上下左右开始遍历 将遇到的1的位置全部置为0 遇到0的地方或者遍历返回 实现 func numIslands ( grid [ ] [ ] byte ) int { var count int if len ( grid ) == 0 { return count } rows := len ( grid ) cols := len ( grid [ 0 ] ) for i := 0 ; i < rows ; i ++ { for j := 0 ; j < cols ; j ++ { if grid [ i ] [ j ] == '1' { dfs ( grid , i , j , rows , cols ) count ++ } } } return count } func dfs ( grid [ ] [ ] byte , i , j , rows , cols int ) { if

【Code】岛屿的数量

谁说我不能喝 提交于 2020-01-14 17:56:23
题目链接:https://leetcode-cn.com/problems/number-of-islands/submissions/ #include < stdio . h > // 方向分别对应上下左右 int directon [ 4 ] [ 2 ] = { { 0 , 1 } , { 0 , - 1 } , { - 1 , 0 } , { 1 , 0 } } ; // dfs的作用就是把一个岛屿的所有点全部给置2 void dfs ( char * * grid , int gridSize , int * gridColSize , int x , int y ) { // 递归结束条件,(1)已经遍历过2 (2)非陆地的点0 if ( grid [ x ] [ y ] != '1' ) { return ; } // 能走到这里的一定是一个1的点,所以在这里需要置位2 grid [ x ] [ y ] = '2' ; // 从点[x , y]开始向四个方向递归遍历置位为2,注意x y可能和i j表示含义有冲突,不要和坐标系弄混 for ( int i = 0 ; i < 4 ; i ++ ) { int nextX = x + directon [ i ] [ 0 ] ; int nextY = y + directon [ i ] [ 1 ] ; // 边界判断