代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙


文章目录

  • [代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙](#代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙)
  • 17.太平洋大西洋水流问题
  • 827.最大人工岛
    • [一、DFS 用全局变量得到area](#一、DFS 用全局变量得到area)
    • [二、DFS 用局部变量](#二、DFS 用局部变量)
    • 三、BFS
  • [127. 单词接龙](#127. 单词接龙)

17.太平洋大西洋水流问题

题目链接

一、DFS

python 复制代码
class Solution(object):
    def pacificAtlantic(self, heights):
        """
        :type heights: List[List[int]]
        :rtype: List[List[int]]
        """
        m,n=len(heights),len(heights[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        pacific=[[0]*n for _ in range(m)]
        atlantic=[[0]*n for _ in range(m)]
        result=[] 
        # DFS
        def dfs(x,y,ocean):
            ocean[x][y]=1
            for d in dirs:
                nextx,nexty=x+d[0],y+d[1]
                if 0 <= nextx < m and 0 <= nexty < n  and heights[nextx][nexty] >=heights[x][y] and ocean[nextx][nexty]==0:
                    dfs(nextx,nexty,ocean)

        for i in range(m):
            dfs(i,0,pacific)
            dfs(i,n-1,atlantic)
        for j in range(n):
            dfs(0,j,pacific)
            dfs(m-1,j,atlantic)
        for i in range(m):
            for j in range(n):
                if pacific[i][j]==1 and atlantic[i][j]==1:
                    result.append([i,j])
        return result
       

二、BFS

python 复制代码
class Solution(object):
    def pacificAtlantic(self, heights):
        """
        :type heights: List[List[int]]
        :rtype: List[List[int]]
        """
        m,n=len(heights),len(heights[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        pacific=[[0]*n for _ in range(m)]
        atlantic=[[0]*n for _ in range(m)]
        result=[] 
        # BFS
        def bfs(x,y,ocean):
            q=collections.deque()
            q.append((x,y))
            ocean[x][y]=1
            while q:
                x,y = q.popleft()
                for d in dirs:
                    nextx,nexty=x+d[0],y+d[1]
                    if 0 <= nextx < m and 0 <= nexty < n  and heights[nextx][nexty] >=heights[x][y] and ocean[nextx][nexty]==0:
                        ocean[nextx][nexty]=1
                        q.append((nextx,nexty))

        for i in range(m):
            bfs(i,0,pacific)
            bfs(i,n-1,atlantic)
        for j in range(n):
            bfs(0,j,pacific)
            bfs(m-1,j,atlantic)
        for i in range(m):
            for j in range(n):
                if pacific[i][j]==1 and atlantic[i][j]==1:
                    result.append([i,j])
        return result

三、本题总结

用两个visited来表示


827.最大人工岛

题目链接

一、DFS 用全局变量得到area

python 复制代码
class Solution(object):
    def largestIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        '''
        总体思路
		利用 DFS 计算出各个岛屿的面积,并标记每个 1(陆地格子)属于哪个岛。
		遍历每个 0,统计其上下左右四个相邻格子所属岛屿的编号,去重后,累加这些岛的面积,更新答案的最大值。
        '''
        m,n = len(grid),len(grid[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        area = collections.defaultdict(int) # 用于储存岛屿面积
        def dfs(x,y,island_num): # 输入岛屿编号
            grid[x][y]=island_num 
            area[island_num] += 1 # 更新岛屿面积
            for d in dirs:
                nextx,nexty=x+d[0],y+d[1]
                if 0 <= nextx < m and 0 <= nexty < n  and grid[nextx][nexty]==1:
                    grid[nextx][nexty]=island_num
                    dfs(nextx,nexty,island_num)
        island_num = 1 
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1: # 遇到新岛屿
                    island_num += 1 # 岛屿编号从2开始
                    dfs(i,j,island_num) 
        ans=0
        for i in range(m):
            for j in range(n):
                s=set() # 去重
                if grid[i][j]==0:
                    for d in dirs:
                        nexti,nextj=i+d[0],j+d[1]
                        if 0 <= nexti < m and 0 <= nextj < n  and grid[nexti][nextj]!=0:
                            s.add(grid[nexti][nextj])
                    ans = max(ans,1+sum(area[idx] for idx in s))

        return ans if ans else n*n # 如果最后 ans 仍然为 0,说明所有格子都是 1,返回 n^2

二、DFS 用局部变量

python 复制代码
class Solution(object):
    def largestIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        '''
        总体思路
利用 DFS 计算出各个岛屿的面积,并标记每个 1(陆地格子)属于哪个岛。
遍历每个 0,统计其上下左右四个相邻格子所属岛屿的编号,去重后,累加这些岛的面积,更新答案的最大值。
        '''
        m,n = len(grid),len(grid[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        area = collections.defaultdict(int) # 用于储存岛屿面积
        def dfs(x,y,island_num): # 输入岛屿编号
            grid[x][y]=island_num 
            size=1
            # area[island_num] += 1 # 更新岛屿面积
            for d in dirs:
                nextx,nexty=x+d[0],y+d[1]
                if 0 <= nextx < m and 0 <= nexty < n  and grid[nextx][nexty]==1:
                    grid[nextx][nexty]=island_num
                    size += dfs(nextx,nexty,island_num)
            return size # 得到岛屿的面积
        island_num = 1 
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1: # 遇到新岛屿
                    island_num += 1 # 岛屿编号从2开始
                    area[island_num]=dfs(i,j,island_num) 
        ans=0
        for i in range(m):
            for j in range(n):
                s=set() # 去重
                if grid[i][j]==0:
                    for d in dirs:
                        nexti,nextj=i+d[0],j+d[1]
                        if 0 <= nexti < m and 0 <= nextj < n  and grid[nexti][nextj]!=0:
                            s.add(grid[nexti][nextj])
                    ans = max(ans,1+sum(area[idx] for idx in s))

        return ans if ans else n*n # 如果最后 ans 仍然为 0,说明所有格子都是 1,返回 n^2

三、BFS

python 复制代码
class Solution(object):
    def largestIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        '''
        总体思路
利用 DFS 计算出各个岛屿的面积,并标记每个 1(陆地格子)属于哪个岛。
遍历每个 0,统计其上下左右四个相邻格子所属岛屿的编号,去重后,累加这些岛的面积,更新答案的最大值。
        '''
        # BFS
        def bfs(x,y,island_num): # 输入岛屿编号
            grid[x][y]=island_num 
            size=1
            # area[island_num] += 1 # 更新岛屿面积
            q=collections.deque()
            q.append((x,y))
            while q:
                x,y=q.popleft()
                for d in dirs:
                    nextx,nexty=x+d[0],y+d[1]
                    if 0 <= nextx < m and 0 <= nexty < n  and grid[nextx][nexty]==1:
                        grid[nextx][nexty]=island_num
                        q.append((nextx,nexty))
                        size += 1
            return size
            
        island_num = 1 
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1: # 遇到新岛屿
                    island_num += 1 # 岛屿编号从2开始
                    # dfs(i,j,island_num) # 法1
                    area[island_num]=bfs(i,j,island_num) 
        ans=0
        for i in range(m):
            for j in range(n):
                s=set() # 去重
                if grid[i][j]==0:
                    for d in dirs:
                        nexti,nextj=i+d[0],j+d[1]
                        if 0 <= nexti < m and 0 <= nextj < n  and grid[nexti][nextj]!=0:
                            s.add(grid[nexti][nextj])
                    ans = max(ans,1+sum(area[idx] for idx in s))

        return ans if ans else n*n # 如果最后 ans 仍然为 0,说明所有格子都是 1,返回 n^2

127. 单词接龙

题目链接


一、BFS

python 复制代码
class Solution(object):
    def ladderLength(self, beginWord, endWord, wordList):
        """
        :type beginWord: str
        :type endWord: str
        :type wordList: List[str]
        :rtype: int
        """
        wordset = set(wordList)
        if len(wordList)==0 or endWord not in wordset :
            return 0
        q = collections.deque()
        q.append(beginWord)
        visited=set(beginWord)
        step=1
        while q:
            level = len(q)
            for l in range(level):
                word = q.popleft()
                word_list = list(word)
                for i in range(len(word_list)):
                    origin_char=word_list[i]
                    for j in range(26):
                        word_list[i] = chr(ord('a')+j)
                        new_word = ''.join(word_list)
                        if new_word in wordset:
                            if new_word == endWord:
                                return step+1
                            if new_word not in visited:
                                q.append(new_word)
                                visited.add(new_word)
                    word_list[i]=origin_char
            step +=1
        return 0  
相关推荐
莫叫石榴姐13 分钟前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
茶猫_1 小时前
力扣面试题 - 25 二进制数转字符串
c语言·算法·leetcode·职场和发展
肥猪猪爸3 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn3 小时前
二分基本实现
数据结构·算法
萝卜兽编程3 小时前
优先级队列
c++·算法
盼海4 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步4 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
Rstln4 小时前
【DP】个人练习-Leetcode-2019. The Score of Students Solving Math Expression
算法·leetcode·职场和发展
芜湖_5 小时前
【山大909算法题】2014-T1
算法·c·单链表
珹洺5 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode