力扣——算法入门计划第九天

简介: 力扣(LeetCode)是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长。 此外,力扣(LeetCode)致力于解决程序员技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化。

 目录

🍕题目

🍔思路

注意:

多源广度优先搜索

🍟详细见代码

🍕题目

🍔广度优先搜索


🍕题目

994. 腐烂的橘子

image.gifimage.png

🍔思路

由题目我们可以知道每分钟每个腐烂的橘子都会使上下左右相邻的新鲜橘子腐烂,这其实是一个模拟广度优先搜索的过程。

观察到对于所有的腐烂橘子,其实它们在广度优先搜索上是等价于同一层的节点的。

有一个腐烂橘子(我们令其为超级源点)会在下一秒把这些橘子都变腐烂,而这个腐烂橘子刚开始在的时间是 -1 ,那么按照广度优先搜索的算法,下一分钟也就是第 0分钟的时候,这个腐烂橘子会把它们都变成腐烂橘子,然后继续向外拓展。

那么在广度优先搜索的时候,我们将这些腐烂橘子都放进队列里进行广度优先搜索即可,最后每个新鲜橘子被腐烂的最短时间 dis[x][y]其实是以这个超级源点的腐烂橘子为起点的广度优先搜索得到的结果。

注意:

为了确认是否所有新鲜橘子都被腐烂,可以记录一个变量 cnt表示当前网格中的新鲜橘子数,广度优先搜索的时候如果有新鲜橘子被腐烂,则 cnt -=  1 ,

最后搜索结束时如果 cnt 大于 0 ,说明有新鲜橘子没被腐烂,返回 -1

否则返回所有新鲜橘子被腐烂的时间的最大值即可

多源广度优先搜索

🍟详细见代码

class Solution:
    def orangesRotting(grid):
        M = len(grid)
        N = len(grid[0])
        queue = []
    count = 0  # count 表示新鲜橘子的数量
    for r in range(M):
        for c in range(N):
            if grid[r][c] == 1:
                count += 1
            elif grid[r][c] == 2:
                queue.append((r, c))
    round = 0  # round 表示腐烂的轮数,或者分钟数
    while count > 0 and len(queue) > 0:  # 还有好橘子且队列还有坏橘子
        round += 1  # 层数+1
        n = len(queue)  # 记录这一层的坏橘子数
        for i in range(n):  # 遍历完这一层的坏橘子
            r, c = queue.pop(0)  # 取出队列开头的坏橘子坐标
            if r-1 >= 0 and grid[r-1][c] == 1:  # 右邻有好橘子
                grid[r-1][c] = 2  # 好橘子变坏
                count -= 1  # 好橘子数-1
                queue.append((r-1, c))  # 新变坏的这只橘子进入坏橘子队列
            if r+1 < M and grid[r+1][c] == 1:  # 左邻有好橘子
                grid[r+1][c] = 2
                count -= 1
                queue.append((r+1, c))
            if c-1 >= 0 and grid[r][c-1] == 1:  # 下邻有好橘子
                grid[r][c-1] = 2
                count -= 1
                queue.append((r, c-1))
            if c+1 < N and grid[r][c+1] == 1:  # 上邻有好橘子
                grid[r][c+1] = 2
                count -= 1
                queue.append((r, c+1))
    if count > 0:  # 还有好橘子
        return -1
    else:  # 没有好橘子了
        return round

image.gif

image.png

🍕题目

542. 01 矩阵

image.png

其实处理的方法很简单:我们在进行广度优先搜索的时候会使用到队列,

在只有一个 0 的时候,我们在搜索前会把这个 0 的位置加入队列,才能开始进行搜索;

如果有多个 0,我们只需要把这些 0的位置都加入队列就行了。(然后套用模板)

通过0找1

🍔广度优先搜索

class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        m, n = len(matrix), len(matrix[0])
        dist = [[0] * n for _ in range(m)]
        zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
        # 将所有的 0 添加进初始队列中
        q = collections.deque(zeroes_pos)
        seen = set(zeroes_pos)
        # 广度优先搜索
        while q:
            i, j = q.popleft()
            for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
                if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
                    dist[ni][nj] = dist[i][j] + 1
                    q.append((ni, nj))
                    seen.add((ni, nj))
        return dist

image.gif

image.png

相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
12天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
24 2
|
1月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
1月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
1月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
1月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
1月前
|
算法
【顺序表】算法题 --- 力扣
【顺序表】算法题 --- 力扣
|
1月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)