[LeetCode题解] 994. 腐烂的橘子

题目链接: https://leetcode-cn.com/problems/rotting-oranges/.

第一次做的时候,通过遍历grid来统计每一次好橘子的个数,由值为2的节点开始向外感染。如果好橘子的个数在t1和t2时间内一样,代表好橘子无法被遍历到,return -1。
由于这种方法需要不断地遍历整个grid(统计好橘子数量),所以时间上损耗较大。

class Solution(object):
    def orangesRotting(self, grid):
        #统计好橘子个数
        good_orange = self.calculate_good_orange(grid)
        time = 0
        temp = 0
        while good_orange > 0:
            time += 1
            for i in range(len(grid)):
                for j in range(len(grid[i])):
                    if grid[i][j] == time + 1:
                        if i >=1 and grid[i-1][j] == 1: grid[i-1][j] = time + 2
                        if j >=1 and grid[i][j-1] == 1:grid[i][j-1] = time + 2
                        if i + 1 < len(grid) and grid[i+1][j] == 1: grid[i+1][j] = time + 2
                        if j + 1 < len(grid[i]) and grid[i][j+1] == 1: grid[i][j+1] = time + 2
            if good_orange == self.calculate_good_orange(grid):
                return -1
            good_orange = self.calculate_good_orange(grid)
        return time

    def calculate_good_orange(self, grid):
        res = 0
        for i in grid:
            for j in i:
                if j == 1:
                    res += 1
        return res

第二次做,通过BFS的层序遍历来统计,性能提高不少。

class Solution(object):
    def orangesRotting(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        '''
        本质上是通过BFS,记录层数
        '''
        m = len(grid)
        n = len(grid[0])
        good_orange = 0
        queue = []
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 2: queue.append((i,j)) #相当于腐烂橘子是初始点,放入queue
                if grid[i][j] == 1: good_orange += 1
        layer = 0
        while good_orange > 0 and len(queue) > 0:
            layer += 1
            for i in range(len(queue)):
                curr = queue.pop(0)
                if curr[0] - 1 >= 0 and grid[curr[0]- 1][curr[1]] == 1:
                    grid[curr[0] - 1][curr[1]] = 2
                    queue.append((curr[0] - 1, curr[1]))
                    good_orange -= 1
                if curr[1] - 1 >= 0 and grid[curr[0]][curr[1] - 1] == 1:
                    grid[curr[0]][curr[1] - 1] = 2
                    queue.append((curr[0], curr[1] - 1))
                    good_orange -= 1
                if curr[0] + 1 < m and grid[curr[0] + 1][curr[1]] == 1:
                    grid[curr[0] + 1][curr[1]] = 2
                    queue.append((curr[0] + 1, curr[1]))
                    good_orange -= 1
                if curr[1] + 1 < n and grid[curr[0]][curr[1] + 1] == 1:
                    grid[curr[0]][curr[1] + 1] = 2
                    queue.append((curr[0], curr[1] + 1))
                    good_orange -= 1
        if good_orange == 0: return layer
        else: return -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值