zoukankan      html  css  js  c++  java
  • interview_bfs&dfs

    1. numbers of islands

     1 class Solution(object):
     2     def dfs(self,grid,i,j):
     3         m,n=len(grid),len(grid[0])
     4 
     5         for k in range(4):
     6             nx,ny=i+self.dirs[k],j+self.dirs[k+1]
     7             if(0<=nx<m and 0<=ny<n and self.visited[nx][ny]==False and grid[nx][ny]=='1'):
     8                 self.visited[nx][ny]=True
     9                 self.dfs(grid,nx,ny)
    10 
    11 
    12     def numIslands(self, grid):
    13         """
    14         :type grid: List[List[str]]
    15         :rtype: int
    16         """
    17         if(len(grid)==0):
    18             return 0
    19         
    20         self.res=0
    21         m,n=len(grid),len(grid[0])
    22 
    23         self.visited=[[False for j in range(n)] for i in range(m)]
    24         self.dirs=[-1,0,1,0,-1]
    25         
    26         for i in range(m):
    27             for j in range(n):
    28                 if(self.visited[i][j]==False and grid[i][j]=='1'):
    29                     self.res+=1
    30                     self.visited[i][j]=True
    31                     self.dfs(grid,i,j)
    32         
    33         return self.res
    34 
    35         

    uf:初始时,每个为“1”的点就是一个岛屿

     1 class Solution(object):
     2     def init_uf(self,grid):
     3         m,n=len(grid),len(grid[0])
     4 
     5         self.fathers=[None]*(m*n)
     6         self.size=[None]*(m*n)
     7         self.cnt=0
     8 
     9         for i in range(m):
    10             for j in range(n):
    11                 if(grid[i][j]=='1'):
    12                     self.fathers[i*n+j]=i*n+j
    13                     self.size[i*n+j]=1
    14                     self.cnt+=1
    15 
    16     def find(self,x):
    17         if(x==self.fathers[x]):
    18             return x
    19 
    20         self.fathers[x]=self.find(self.fathers[x])
    21         return self.fathers[x]
    22 
    23     def connect(self,x,y):
    24         fx,fy=self.find(x),self.find(y)
    25         if(fx!=fy):
    26             self.fathers[fx]=fy
    27             self.size[fy]+=self.size[fx]
    28             self.cnt-=1
    29 
    30     def numIslands(self, grid):
    31         """
    32         :type grid: List[List[str]]
    33         :rtype: int
    34         """
    35         if(len(grid)==0):
    36             return 0
    37         
    38         self.res=0
    39         m,n=len(grid),len(grid[0])
    40         self.init_uf(grid)
    41 
    42         self.dirs=[-1,0,1,0,-1]
    43         
    44         for i in range(m):
    45             for j in range(n):
    46                 if(grid[i][j]=='1'):
    47 
    48                     for k in range(4):
    49                         nx,ny=i+self.dirs[k],j+self.dirs[k+1]
    50                         if(0<=nx<m and 0<=ny<n and grid[nx][ny]=='1'):
    51                             self.connect(i*n+j,nx*n+ny)
    52 
    53         return self.cnt
    54 
    55         

    2. word ladder

     

     1 class Solution(object):
     2     def bfs(self,beginWord,endWord,graph):
     3         hash={}     # 单词:起点到单词的距离
     4         min_step=0
     5         self.queue.append((beginWord,-1,1))
     6         front=0
     7 
     8         while(front!=len(self.queue)):   # fornt指向queue尾部时,队列为空
     9             node=self.queue[front][0]
    10             step=self.queue[front][2]
    11 
    12             if(min_step!=0 and step>min_step):
    13                 break
    14                 
    15             if(node==endWord):
    16                 min_step=step
    17                 self.end_word_pos.append(front)
    18             
    19             nbs=graph[node]
    20             for nb in nbs:
    21                 if(nb not in hash or hash[nb]==step+1):
    22                     self.queue.append((nb,front,step+1))
    23                     hash[nb]=step+1
    24 
    25             front+=1
    26 
    27     def findLadders(self, beginWord, endWord, wordList):
    28         self.res=[]
    29         
    30         wordSet=set(wordList)
    31         wordSet.add(beginWord)
    32         if(endWord not in wordSet):
    33             return self.res
    34 
    35         graph={}        # construct graph
    36         tmp_que=[beginWord]
    37         for word in wordSet:
    38             graph[word]=set()
    39 
    40         while(len(tmp_que)!=0):
    41             cur=tmp_que.pop(0)
    42 
    43             for i in range(len(cur)):
    44                 for k in "abcdefghijklmnopqrstuvwxyz":
    45                     tmp_word=cur[:i]+k+cur[i+1:]
    46                     
    47                     if(tmp_word!=cur and tmp_word in wordSet):
    48                         if(len(graph[tmp_word])==0):
    49                             tmp_que.append(tmp_word)
    50 
    51                         graph[cur].add(tmp_word)
    52                         graph[tmp_word].add(cur)
    53         # print(graph)
    54 
    55 
    56         self.queue=[]
    57         self.end_word_pos=[]
    58         self.bfs(beginWord,endWord,graph)
    59 
    60         for i in range(len(self.end_word_pos)):
    61             pos=self.end_word_pos[i]
    62             path=[]
    63             while(pos!=-1):
    64                 path.append(self.queue[pos][0])
    65                 pos=self.queue[pos][1]
    66             
    67             self.res.append(path[::-1])
    68 
    69         return self.res

    beginWord="hit"
    endWord="cog"
    WordList=['hot','dot','dog','lot','log','cog']

    s=Solution()
    res=s.wordlabber(beginWord,endWord,WordList)
    print(res)

    3. trapping water ii

     1 from Queue import PriorityQueue
     2 
     3 class Solution(object):
     4     def trapRainWater(self, heightMap):
     5         """
     6         :type heightMap: List[List[int]]
     7         :rtype: int
     8         """
     9         self.res=0
    10         if(len(heightMap)==0):
    11             return self.res
    12         m,n=len(heightMap),len(heightMap[0])
    13 
    14         visited=[[False for j in range(n)] for i in range(m)]
    15 
    16         pq=PriorityQueue()
    17         for i in range(m):
    18             for j in range(n):
    19                 if(i==0 or i==m-1 or j==0 or j==n-1):
    20                     pq.put((heightMap[i][j],i,j))
    21                     visited[i][j]=True
    22 
    23         self.dirs=[-1,0,1,0,-1]
    24         
    25         while(pq.qsize()!=0):
    26             cur_h,i,j=pq.get()
    27 
    28             for k in range(4):
    29                 nx,ny=i+self.dirs[k],j+self.dirs[k+1]
    30                 if(0<=nx<m and 0<=ny<n and visited[nx][ny]==False):
    31                     visited[nx][ny]=True
    32                     tmp_h=max(cur_h,heightMap[nx][ny])
    33                     self.res+=tmp_h-heightMap[nx][ny]
    34 
    35                     pq.put((tmp_h,nx,ny))
    36         
    37         return self.res

    4.

    79. Word Search

    给定一个二维网格和一个单词,找出该单词是否存在于网格中。

    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

     1 class Solution(object):
     2     def dfs(self,board,word,i,j,idx):
     3         m,n=len(board),len(board[0])
     4         if(idx==len(word)):
     5             return True
     6         
     7         if(i<0 or i>=m or j<0 or j>=n or word[idx]!=board[i][j] or self.visited[i][j]==True):
     8             return False
     9         
    10         self.visited[i][j]=True
    11 
    12 
    13         # for k in range(4):
    14         #     nx,ny=i+self.dirs[k],j+self.dirs[k+1]
    15         #     if(self.dfs(board,word,nx,ny,idx+1)):
    16         #         return True
    17         res=self.dfs(board,word,i,j-1,idx+1) or self.dfs(board,word,i,j+1,idx+1) or self.dfs(board,word,i-1,j,idx+1) or self.dfs(board,word,i+1,j,idx+1)
    18 
    19 
    20         self.visited[i][j]=False
    21         
    22         return res
    23         # return False      # 搭配for循环
    24 
    25     def exist(self, board, word):
    26         """
    27         :type board: List[List[str]]
    28         :type word: str
    29         :rtype: bool
    30         """
    31         if(len(board))==0:
    32             return False
    33         
    34         self.dirs=[-1,0,1,0,-1]
    35         m,n=len(board),len(board[0])
    36         self.visited=[[False for j in range(n)] for i in range(m)]
    37 
    38         for i in range(m):
    39             for j in range(n):
    40                 if self.dfs(board,word,i,j,0):
    41                     return True
    42         
    43         return False
  • 相关阅读:
    8.C++-类的关键字
    BFS-九宫格重排(详解)
    7.C++类与封装的概念
    4.数码相框-freetype多行显示,居中显示
    3.数码相框-通过freetype库实现矢量显示
    Linux-iconv命令、并批处理将所有GBK文件转换为UTF8(18)
    2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)
    1.数码相框-相框框架分析(1)
    Kotlin 之操作符重载
    Andorid-解决View重复点击的思路
  • 原文地址:https://www.cnblogs.com/zijidan/p/12506003.html
Copyright © 2011-2022 走看看