2021-07-15leetcode刷题

2021-07-15  本文已影响0人  Cipolee

leetcode的执行用时并不特别准,同一个代码不同提交结果不同。

    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
        #深度优先搜索需要函数里定义函数,使用外部函数里的变量,作用域包括内部函数
        max_row=len(image)
        max_col=len(image[0])
        #isvisited=[[False]*len(image[0])]*len(image)
        #向量乘后会造成修改,将该列所有位置更改
        #isvisited=[[False for j in range(len(image[0]))] for i in range(len(image))]
        #print(isvisited)
        curcolor=image[sr][sc]
        def dfs(sr,sc):
            
            #global isvisited

            if curcolor!=image[sr][sc]:
                return
            else:
                image[sr][sc]=newColor
                #print(isvisited,sr,sc)
                #isvisited[sr][sc]=True
                #print(isvisited,sr,sc)
                print("hi")
                if sr+1<len(image):
                    dfs(sr+1,sc)
                if sr-1>=0:
                    dfs(sr-1,sc)
                if sc+1<len(image[0]):
                    dfs(sr,sc+1)
                if sc-1>=0:
                    dfs(sr,sc-1)     
        #print(isvisited)
        if image[sr][sc]!=newColor:
            dfs(sr,sc)
        return image  
非标准写法
 def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
        #深度优先搜索需要函数里定义函数,使用外部函数里的变量,作用域包括内部函数
        max_row=len(image)
        max_col=len(image[0])
        #isvisited=[[False]*len(image[0])]*len(image)
        #向量乘后会造成修改,将该列所有位置更改
        isvisited=[[False for j in range(len(image[0]))] for i in range(len(image))]
        #print(isvisited)
        curcolor=image[sr][sc]
        def dfs(sr,sc):
            
            #global isvisited

            if curcolor!=image[sr][sc] or isvisited[sr][sc]:
                return
            else:
                image[sr][sc]=newColor
                #print(isvisited,sr,sc)
                isvisited[sr][sc]=True
                #print(isvisited,sr,sc)
                #print("hi")
                if sr+1<len(image):
                    dfs(sr+1,sc)
                if sr-1>=0:
                    dfs(sr-1,sc)
                if sc+1<len(image[0]):
                    dfs(sr,sc+1)
                if sc-1>=0:
                    dfs(sr,sc-1)     
        #print(isvisited)
        if image[sr][sc]!=newColor:
            dfs(sr,sc)
        return image   

非标准写法
class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        isvisited=[[False  for j in range(len(grid[0]))] for i in range(len(grid))]
        def dfs(i,j):
            ans=0
            if isvisited[i][j] or grid[i][j]==0:
                return 0
            else:
                isvisited[i][j]=True
                ans+=1
                for r,c in [(i-1,j),(i+1,j),(i,j+1),(i,j-1)]:
                    if 0<=r<len(grid) and 0<=c<len(grid[0]) and not isvisited[r][c]:
                        ans+=dfs(r,c)
            return ans
        max_area=0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if not isvisited[i][j] and grid[i][j]==1:
                    per_area=dfs(i,j)
                    max_area=max(max_area,per_area)
        return max_area
一遍过,标准写法

掌握好深搜的结构,写出深搜来很简单,栈+树

修改isvisited后和层相关的变量都需要修改(层深度,在该层做的修改)

        order_list=[1,2,3,4]
        order_all=[]
        isvisited=[False]*4
        def dfs(i,cnt,per):
            if cnt==4:
                #print("hi")
                order_all.append([i for i in per])
                return
            else:
                for i in range(4):
                    if not isvisited[i]:
                        isvisited[i]=True
                        cnt+=1
                        per.append(i+1)
                        dfs(i,cnt,per)
                        per.pop()
                        cnt-=1
                        isvisited[i]=False
        for i in range(4):
            isvisited[i]=True
            dfs(i,1,[i+1])
            isvisited[i]=False
        print(order_all)
        print(len(order_all))
1-4的全排列实例

题目描述如下

"""
# Definition for a Node.
class Node:
    def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next

"""



class Solution:
    def connect(self, root: 'Node') -> 'Node':
        #广度搜索+队列
        if root==None:
            return None
        list_node=[None,root]
        left_idx,right_idx=1,2
        while(True):
            if not list_node[left_idx].left:
                break
            for i in range(left_idx,right_idx):
                list_node.append(list_node[i].left)
                list_node.append(list_node[i].right)
            left_idx=right_idx
            right_idx=2*right_idx
        cnt,ch_num=0,1
        #print(len(list_node))
        for i in range(1,len(list_node)):
            cnt+=1
            if cnt==ch_num:
                ch_num*=2
                list_node[i].next=None
                cnt=0
            else:
                list_node[i].next=list_node[i+1]
        list_node.clear()
        return root

使用内存大,但是时间快,也是广度的思想

题目

在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
示例 1:
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4

class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        rotten_list=[(i,j) for j in range(len(grid[0]))for i in range(len(grid)) \
        if grid[i][j]==2]
        q=collections.deque(rotten_list)
        isvisted=[[False]*len(grid[0])for _ in range(len(grid))]
        v_a_flag,ans=False,0
        left,right,move=0,len(q),len(q)
        while q:
            x,y=q.popleft()
            isvisted[x][y]=True
            if left==right:
                right=move
                #print(left,right)
                ans+=1
            left+=1
            ##move+=1
            for nx,ny in [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]:
                if 0<=nx<len(grid) and 0<=ny<len(grid[0]) and not isvisted[nx][ny]\
                and grid[nx][ny]==1:
                    move+=1
                    isvisted[nx][ny]=True
                    q.append((nx,ny))
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if isvisted[i][j]==False and grid[i][j]==1:
                    #error1马虎,变量名字写错
                    return -1
        #print(isvisted[2][0],grid[2][0])
        return ans
image.png
上一篇下一篇

猜你喜欢

热点阅读