JZX 轻语

挖掘时光的细节

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), ...

LeetCode 1253 - 重构2行二进制矩阵

Flash 此文章属于Flash闪念部分的短文
可以使用贪心解决:首先直接将参数upper和lower视作为第一行和第二行待填充1的个数。从左到右遍历colsum,如果遇到2,则需要同时填充两行,并更新upper和lower;如果遇到1,即仅需填充一行,此时取upper和lower中剩余值较大的一个进行填充,并更新计数;如果遇到0,则不需要填充,直接跳过。最后,如果upper和lower都为0,则返回填充后的矩阵,否则返回空列表(题意表明...

LeetCode 1249 - 移除无效括号

Flash 此文章属于Flash闪念部分的短文
使用栈来维护未匹配的左括号的位置信息。如果遇到了右括号,且栈为空,则说明该右括号是多余的,需要被移除;如果栈非空,则弹出栈顶元素,表示该左括号已经匹配。最后,栈中剩余的元素即为多余的左括号,需要被移除。 对于Python而言,由于字符串是不可变的,需要将字符串转换为列表进行处理,移除操作等价于将列表对应位置的元素置为""。最后,将列表使用str.join转换为字符串返回即可。 cla...

LeetCode 1247 - 交换字符使得字符串相同

Flash 此文章属于Flash闪念部分的短文
需要一些观察和分析,首先,在同一个下标i下,如果s1[i]为x,而s2[i]为y,将其记为xy对;如果s1[i]为y,而s2[i]为x,将其记为yx对。那么,如果存在两个相同的xy对(或者两个相同的yx对),那么可以通过一次交换将这两个对应的下标变为相同的字符;而如果仅有一个xy对以及一个yx对,那么需要两次交换才能将其变为相同的字符。对于整个字符串而言,如果xy对和yx对的个数总和为奇数,...