JZX 轻语

挖掘时光的细节

LeetCode 3112 - 访问消失节点的最少时间

Flash 此文章属于Flash闪念部分的短文
单源最短路径问题的变种,可使用Dijkstra算法解决。如果从节点0到某个节点i的最短路径大于等于disappear[i],则该节点不可达,此外,该节点也不可参与松弛操作。因此,只需要在Dijkstra算法中加入这个判断条件即可。 一开始基于优先队列的算法实现,注意这里的消失条件判断放在了松弛操作之前。 import heapq class Solution: def m...

LeetCode 2959 - 访问消失节点的最少时间

Flash 此文章属于Flash闪念部分的短文
多源最短路径问题的变种,可使用Floyd算法解决。题意要求求解的是去掉某些节点后,所有节点之间的最短路径都不超过maxDistance的方案数。可以逆向思考,求解子集中所有节点之间的最短路径都不超过maxDistance的子集数量。因此,我们可以使用回溯法枚举所有子集,然后使用Floyd算法求解子集中所有节点之间的最短路径,最后统计满足条件的子集数量。需要注意的是,如果在每个枚举中都重新来一...

LeetCode 1283 - 使结果不超过阈值的最小除数

Flash 此文章属于Flash闪念部分的短文
此类寻找满足某种条件中的最小值的题目,通常可以使用二分搜索来解决。对于本题,我们定义check函数为判断是否满足条件(即遍历数组,累加每个元素的除法取上界结果)的函数,然后使用二分搜索来寻找最小的满足check函数为True的值。 class Solution: def smallestDivisor(self, nums: List[int], threshold: int)...

LeetCode 1282 - 用户分组

Flash 此文章属于Flash闪念部分的短文
有两种方法:一种是基于排序,即先对groupSizes带上序号按(组大小, 序号)进行排序,然后遍历上述有序的数组,将相同大小(相同组大小的元素连续分布)的分组放入同一个组;另一种则使用哈希表,记录映射组大小 -> 当前组的序号列表,当某个组大小对应的序号列表长度达到threshold时,将其放入结果列表中,并重置(清空)列表。 基于排序的做法: class Solution:...

LeetCode 1277 - 统计全为 1 的正方形子矩阵

Flash 此文章属于Flash闪念部分的短文
通过观察发现,如果一个正方形子矩阵的右下角是(i, j),且边长为k,那么这个该正方形包含四个重叠的、边长为k - 1的正方形子矩阵,分别以(i - 1, j - 1)、(i - 1, j)、(i, j - 1)、(i, j)为右下角。 因此,我们可以定义dp[i][j]为以(i, j)为右下角的正方形子矩阵的最大边长,那么有状态转移方程dp[i][j] = min(dp[i - 1][j...

LeetCode 1276 - 不浪费原料的汉堡制作方案

Flash 此文章属于Flash闪念部分的短文
鸡兔同笼问题的变种,给定两个参数tomatoSlices(简记为t)和cheeseSlices(简记为c)表示番茄和奶酪的数量,问在用尽所有原料的情况下,能制作多少个巨无霸汉堡(记为x)和小皇堡(记为y)。不难得知x + y = c,4x + 2y = t,解方程组即可得到结果x = t / 2 - c,y = 2c - t / 2。需要注意的是,x和y必须是整数,且x >= 0,y ...

LeetCode 1268 - 搜索推荐系统

Flash 此文章属于Flash闪念部分的短文
两种做法:一种是基于字典树,即在原模板代码的基础上,给每一个Trie节点新增一个成员变量candidates,用于存储当前节点对应的前缀中字典序top-3的单词,先将所有的单词加入到Trie树中,后面再按搜索词遍历树,沿着节点将candidates添加到结果中;另一种是基于二分搜索,先对单词列表进行排序,然后枚举搜索词的前缀,使用二分搜索找到第一个大于等于该前缀的单词,然后向后选择三个单词即...

LeetCode 1267 - 统计参与通信的服务器

Flash 此文章属于Flash闪念部分的短文
本质就是找到一组服务器,其中每个服务器至少和另一个服务器处在同一行或同一列中。一开始想用的是并查集,但不用那么复杂。有两种方法,第一种也是官解的做法,即两次遍历+哈希表的做法,首先第一次遍历用于统计每一行和每一列的服务器数量,第二次遍历则检查服务器对应的行和列是否有其他服务器,如果有,则计数; 第二种方法也是遍历两次,但第二次遍历仅需遍历行即可,使用的是逆向思维:统计落单的服务器个数,最后...

LeetCode 1262 - 可被三整除的最大和

Flash 此文章属于Flash闪念部分的短文
比较容易想到使用动态规划的方法,定义dp[j][i](其中0 <= i < 3)表示数组前j个元素中,模3余数为i的最大和。遍历数组,对于每一个nums[j],更新dp[j][(i + nums[j]) % 3] = max(dp[j - 1][(i + nums[j]) % 3], dp[j - 1][i] + nums[j])。最终的答案就是dp[len(nums) - 1]...

LeetCode 1254 - 统计封闭岛屿的数目

Flash 此文章属于Flash闪念部分的短文
所谓的封闭是指四周全都被1包围的0,因此我们可以通过BFS遍历整个矩阵,将所有相邻的0视作为一个岛屿,如果四周没有遇到边界,说明就是封闭岛屿。为了避免重复遍历,我们可以将遍历过的0原地置为1,表示已经遍历过,且不会影响后续的遍历。 from collections import deque class Solution: moves = ((0, 1), (0, -1), ...