美文网首页
2021-07-15leetcode刷题

2021-07-15leetcode刷题

作者: Cipolee | 来源:发表于2021-07-15 23:33 被阅读0次

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的全排列实例

题目描述如下

  • 注意的是right值的更换是用的满二叉树的性质

  • 判断首先判断列表是不是空的,队列的判断也是学问,一般是看left的下一层还存在不,不存在说明list已经包含满了(right指向最后一个)

"""
# 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

相关文章

  • 2021-07-15leetcode刷题

    leetcode的执行用时并不特别准,同一个代码不同提交结果不同。 掌握好深搜的结构,写出深搜来很简单,栈+树 修...

  • 刷题刷题

    时间紧迫,任务繁重,又有疫情影响,搞的人心惶惶,一时间复习得不安宁,又舍不得摆烂。 在焦灼、惶恐的情绪中,紧张急迫...

  • 2022-09-16

    刷题,刷题还是刷题

  • 2018-07-16

    刷题,祸害的何止是教育? 报班,刷题;买练习册,刷题;家教,刷题;跟不上,刷题;学得好,刷题;为了抢跑,刷题;为了...

  • 刷题啊刷题

    因为月底又要考试,所以最近几天一直在刷题。按说是看了书再看视频再刷题效果比较好才是。可是来不及了啊。 上次考试,就...

  • 刷题啊刷题

    刷题啊刷题 因为11月中旬要举行期中考试,所以最近几天,学校精心组织,一直在刷题。按说是看了书再看PPT课件或教师...

  • 2020-02-01关于刷题的几个建议

    算法刷题 针对性刷题,刻意练习。刻意刷题!不是麻木刷题!刷题前一定要先看书,清楚明白为什么要刷这些题,这些题刷完能...

  • 刷题

    清早起来刷题 吃饭也在刷题 上厕所也在刷题 中午也在刷题 下午也在刷题 晚上也在刷题 一天到晚都在刷题 考试马上到...

  • 程序猿刷题网站你知道吗?

    Coderbyte 刷题网LeetCode 刷题网Stack Overflow 刷题网

  • 教你怎么做一只考试锦鲤

    考试前14天疯狂刷题,各个平台疯狂刷题,刷题就对了。 刷的越多,大脑记得越多,也许你刷10道题,能记住的只有1道题...

网友评论

      本文标题:2021-07-15leetcode刷题

      本文链接:https://www.haomeiwen.com/subject/wfzmpltx.html