代码随想录算法训练营Day 62| 图论 part02 | 695. 岛屿的最大面积、1020.飞地的数量、130.被围绕的区域

代码随想录算法训练营Day 62| 图论 part02 | 695. 岛屿的最大面积、1020.飞地的数量、130.被围绕的区域



65.岛屿的最大面积

题目链接

一、BFS

class Solution(object):
    def maxAreaOfIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # BFS
        m,n = len(grid),len(grid[0])
        visited = [[False]*n for _ in range(m)]
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        maxres = 0
        def bfs(i,j):
            q = collections.deque()
            q.append((i,j))
            visited[i][j]=True
            count=1
            while q:
                x,y = q.popleft()
                for d in dirs:
                    nextx = x+d[0]
                    nexty = y+d[1]
                    if nextx<0 or nextx>=m or nexty<0 or nexty>=n:
                        continue
                    if visited[nextx][nexty] or grid[nextx][nexty]==0:
                        continue
                    q.append((nextx,nexty))
                    visited[nextx][nexty]=True
                    count +=1
            return count
            
        for i in range(m):
            for j in range(n):
                if not visited[i][j] and grid[i][j]==1:
                    count = bfs(i,j)
                    maxres = max(maxres,count)
        return maxres

二、DFS

class Solution(object):
    def maxAreaOfIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # DFS
        m,n = len(grid),len(grid[0])
        visited = [[False]*n for _ in range(m)]
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        result = 0
        def dfs(x,y):
            count = 1
            for d in dirs:
                nextx = x+d[0]
                nexty = y+d[1]
                if nextx>=m or nextx<0 or nexty>=n or nexty<0:
                    continue
                if visited[nextx][nexty] or grid[nextx][nexty]==0:
                    continue
                visited[nextx][nexty]=True
                res = dfs(nextx,nexty)
                count += res
            return count
        for i in range(m):
            for j in range(n):
                if not visited[i][j] and grid[i][j]==1:
                    visited[i][j]=True
                    count = dfs(i,j)
                    result = max(result,count)
        return result

1020.飞地的数量

题目链接

一、DFS

class Solution(object):
    def numEnclaves(self, grid):
        m, n = len(grid), len(grid[0])
        visited = [[False] * n for _ in range(m)]
        dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)]

        def dfs(x, y):
            visited[x][y] = True
            # grid[x][y] = 2  # Mark as visited by changing the value to 2
            for d in dirs:
                nextx, nexty = x + d[0], y + d[1]
                if 0 <= nextx < m and 0 <= nexty < n and not visited[nextx][nexty] and grid[nextx][nexty] == 1:
                    dfs(nextx, nexty)

        for i in range(m):
            for j in [0, n-1]:  # Only left and right borders
                if grid[i][j] == 1 and not visited[i][j]:
                    dfs(i, j)
        for j in range(n):
            for i in [0, m-1]:  # Only top and bottom borders
                if grid[i][j] == 1 and not visited[i][j]:
                    dfs(i, j)

        # Count cells that are still 1 (enclaves)
        res = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1 and not visited[i][j]:
                    res += 1
        return res

二、BFS

class Solution(object):
    def numEnclaves(self, grid):
        m, n = len(grid), len(grid[0])
        visited = [[False] * n for _ in range(m)]
        dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)]
        # BFS
        def bfs(x,y):
            q = collections.deque()
            q.append((x,y))
            while q:
                x,y = q.popleft()
                for d in dirs:
                    nextx = x+d[0]
                    nexty = y+d[1]
                    if 0<= nextx <m and 0<=nexty<n and visited[nextx][nexty]==False and grid[nextx][nexty]==1:
                        q.append((nextx,nexty))
                        visited[nextx][nexty]=True
                        
            
        for i in range(m):
            for j in [0,n-1]:
                if visited[i][j]==False and grid[i][j]==1:
                    visited[i][j]=True
                    bfs(i,j)
        for j in range(n):
            for i in [0,m-1]:
                if visited[i][j]==False and grid[i][j]==1:
                    visited[i][j]=True
                    bfs(i,j)


        # Count cells that are still 1 (enclaves)
        res = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1 and not visited[i][j]:
                    res += 1
        return res

三、本题总结

其实就是从边缘遍历,不是整幅图遍历,最后边缘能遍历到的就都visited=True了,剩下的False且为陆地的就是飞地。


130.被围绕的区域

题目链接

一、DFS

class Solution(object):
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: None Do not return anything, modify board in-place instead.
        """
        # DFS
        m, n = len(board), len(board[0])
        dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)]
        # DFS
        def dfs(x, y):
            board[x][y] = 'A'  # Mark as visited by changing the value to 2
            for d in dirs:
                nextx, nexty = x + d[0], y + d[1]
                if 0 <= nextx < m and 0 <= nexty < n  and board[nextx][nexty] == 'O':
                    dfs(nextx, nexty)

        for i in range(m):
            for j in [0, n-1]:  # Only left and right borders
                if board[i][j] == 'O' :
                    dfs(i, j)
        for j in range(n):
            for i in [0, m-1]:  # Only top and bottom borders
                if board[i][j] == 'O' :
                    dfs(i, j)

        for i in range(m):
            for j in range(n):
                if board[i][j] == 'O' :
                    board[i][j]='X'
                if board[i][j]=='A':
                    board[i][j]='O'
        return board

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 04:04:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 04:04:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 04:04:03       57 阅读
  4. Python语言-面向对象

    2024-07-13 04:04:03       68 阅读

热门阅读

  1. HTTPS和HTTP有哪些区别

    2024-07-13 04:04:03       20 阅读
  2. Qt开发 | Qt创建线程 | Qt并发-QtConcurrent

    2024-07-13 04:04:03       15 阅读
  3. UI图标库推荐网站

    2024-07-13 04:04:03       20 阅读
  4. 从零开始学习cartographer源码之01.gflags与glog

    2024-07-13 04:04:03       15 阅读
  5. [NeetCode 150] Valid Sudoku

    2024-07-13 04:04:03       20 阅读
  6. C#中AsMemory方法

    2024-07-13 04:04:03       22 阅读
  7. js ES6 part3

    2024-07-13 04:04:03       24 阅读