【深度优先搜索-中等】1034. 边界着色

题目
在这里插入图片描述注意:这题是对联通分量的边界进行着色,笔者第一遍做的时候就是忽略了这一点

【代码】
在这里插入图片描述

class Solution:
    def colorBorder(self, grid: List[List[int]], row: int, col: int, color: int) -> List[List[int]]:
        origin=grid[row][col]
        if origin==color:return grid
        stack=[(row,col)]
        p=set()
        while stack:
            row,col=stack.pop()
            if 0<=row<len(grid) and 0<=col<len(grid[0]) and grid[row][col]==origin:
                p.add((row,col))
                for mx,my in [(row-1,col),(row+1,col),(row,col-1),(row,col+1)]:
                    if (mx,my) not in p:
                        stack.append((mx,my))
        for x,y in p:            
            for row,col in [(x-1,y),(x+1,y),(x,y+1),(x,y-1)]:
                if (0<=row<len(grid) and 0<=col<len(grid[0]) and grid[row][col]!=origin and (row,col) not in p) or not(0<=row<len(grid) and 0<=col<len(grid[0])):
                    grid[x][y]=color
        return grid

【方法2】dfs
在这里插入图片描述

class Solution:
    def colorBorder(self, grid: List[List[int]], row: int, col: int, color: int) -> List[List[int]]:
        origin=grid[row][col]
        if origin==color:return grid
        def dfs(row,col):
            if 0<=row<len(grid) and 0<=col<len(grid[0]) and grid[row][col]==origin:
                grid[row][col]=99999
                return {(row,col)}|dfs(row-1,col)|dfs(row+1,col)|dfs(row,col-1)|dfs(row,col+1)
            return set()
        p=dfs(row,col)
        for x,y in p:
            for row,col in [(x-1,y),(x+1,y),(x,y+1),(x,y-1)]:
                if (0<=row<len(grid) and 0<=col<len(grid[0]) and grid[row][col]!=origin and (row,col) not in p) or not(0<=row<len(grid) and 0<=col<len(grid[0])):
                    grid[x][y]=color
                elif (0<=row<len(grid) and 0<=col<len(grid[0]) and grid[row][col]==99999):
                    grid[row][col]=origin
        return grid
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值