zoukankan      html  css  js  c++  java
  • 岛屿的最大面积

    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’。

    #广度优先搜索
    # 将接下来的元素放入队列,只要对列非空,出对列并判断是否为边界,否则是陆地,标记,以新位置开始移动加入队列
    def maxAreaOfIsland(grid) -> int:
        ans = 0
        for i,l in enumerate(grid):
            for j,n in enumerate(l):
                que = [[i,j]]#加入队列
                cur = 0
                while que:
                    cur_i,cur_j = que.pop(0)#出对列,判断
                    if cur_i<0 or cur_i==len(grid) or cur_j <0 or cur_j==len(grid[0]) or grid[cur_i][cur_j] !=1:
                        continue
                    cur += 1
                    grid[cur_i][cur_j] = 0#标记,开始新的加入
                    for di,dj in [[0,1],[0,-1],[1,0],[-1,0]]:
                        next_i,next_j = cur_i+di,cur_j+dj
                        que.append([next_i,next_j])
                ans = max(cur,ans)
        return ans
    
    #深度优先搜索,栈
    # 将接下来的元素放入栈,只要栈非空,出栈并判断是否为边界,否则是陆地,标记,以新位置开始移动加入栈
    def  maxAreaOfIsland(grid) -> int:
        ans = 0
        for i,l in enumerate(grid):
            for j,n in enumerate(l):
                stack = [[i,j]]#加入栈,用list作为栈,list尾部作为栈顶
                cur = 0
                while stack:
                    cur_i,cur_j = stack.pop()#出栈
                    if cur_i<0 or cur_i==len(grid) or cur_j <0 or cur_j==len(grid[0]) or grid[cur_i][cur_j] !=1:
                        continue
                    cur += 1
                    grid[cur_i][cur_j] = 0#标记,开始新的加入
                    for di,dj in [[0,1],[0,-1],[1,0],[-1,0]]:
                        next_i,next_j = cur_i+di,cur_j+dj
                        stack.append([next_i,next_j])
                ans = max(cur,ans)
        return ans
    
    # 深度优先搜索,递归
    # 定义一个外部函数判断当前位置是否为边界,边界则返回0函数结束,如果不是,移动位置递归,每递归一次+1
    
    def maxAreaOfIsland(grid) -> int:
        ans = 0
        for i,l in enumerate(grid):
            for j,n in enumerate(l):
                ans = max(dfs(grid,i,j),ans)
        return ans
    
    def dfs(grid,i,j):
        if i<0 or i==len(grid) or j <0 or j==len(grid[0]) or grid[i][j] !=1:
            return 0
        ans = 1
        grid[i][j] = 0#标记
        for di,dj in [[0,1],[0,-1],[1,0],[-1,0]]:
            next_i,next_j = i+di,j+dj
            ans += dfs(grid,next_i,next_j)
        return ans
    
  • 相关阅读:
    Unity3D之Mesh【创建动态Mesh的学习网站】
    Unity3D之Mesh(三)绘制四边形
    Unity3D之Mesh(二)为三角形添加纹理
    unity的一些重要技巧(转)【整理他人的东西】
    Unity3D之Mesh(一)绘制三角形
    Unity3D连接WCF
    zabbix server搭建遇到的问题
    zabbix server for Centos 6.3
    JAVA笔记整理(九),JAVA中的集合
    MySQL主从复制(Centos6.3&MySQL5.6)
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12497256.html
Copyright © 2011-2022 走看看