复盘|2022.5每日一题
5.1题目 1305. 两棵二叉搜索树中的所有元素
【中序遍历 + 归并】中序遍历这两棵二叉搜索树,可以得到两个有序数组。然后可以使用双指针方法来合并这两个有序数组.
5.2题目 591. 标签验证器
【栈 + 字符串遍历】一次遍历,判断是否合法。
5.3题目 937. 重新排列日志文件
【自定义排序】定义比较函数logCompare时,有两个输入log1和log2。当相等时,返回0;当log1大时,返回正数;当log2大时,返回负数。
5.4题目 1823. 找出游戏的获胜者
【队列】按题意模拟。
5.5题目 713. 乘积小于 K 的子数组
【滑动窗口】枚举子数组右端点j,左端点从i = 0开始用prod记录子数字[i,j]的元素乘积。
5.6题目 933. 最近的请求次数
【队列】用一个队列维护发生请求的时间,当在时间t收到请求时,将时间t入队。
5.7题目 433. 最小基因变化
【BFS】尝试所有合法的基因变化,并找到最小的变换次数即可.
5.8题目 442. 数组中重复的数据
【一次遍历】用正负号作为标记,正数说明没出现过,加上负号,负数说明已经出现过,加入答案。
5.9题目 942. 增减字符串匹配
【贪心】每次都选择的是最小数和最大数,可以用两个变量o和hi表示当前剩余数字中的最小数和最大数。
5.10题目 1728. 猫和老鼠 II
【拓扑排序】极大极小博弈,老鼠尽量找自己获胜的,其次接受平局 猫尽量找自己获胜的,其次接受平局,param m: 老鼠的位置,param c: 猫的位置,param i: 回合。
5.11题目 449. 序列化和反序列化二叉搜索树
【后序遍历】序列化时,只需要对二叉搜索树进行后序遍历,再将数组编码成字符串即可。
5.12题目 944. 删列造序
【遍历】逐列访问字符串数组,统计不是按字典序升序排列的列。
5.13题目 面试题 01.05. 一次编辑
【分类讨论】如果frst和second需要一次编辑,则可能有三种情况:往frst中插入一个字符得到second,此时n-m=1,second比irst多一个字符,其余字符都相同;从first中删除一个字符得到second,此时m-n=1,first比second多一个字符,其余字符都相同;将first中的一个字符替换成不同的字符得到second,此时m=n,first和second恰好有一个字符不同。
5.14题目 691. 贴纸拼词
【记忆化搜索 + 状态压缩】定义函数dp(mask)来求解不同状态的最小贴纸数,输入是某个子序列mask,输出是拼出该子序列的最小贴纸数。
5.15题目 812. 最大三角形面积
【枚举】三角形面积公式。
5.16题目 面试题 04.06. 后继者
【中序遍历】由于只需要找到节点p的后继节点,因此不需要维护完整的中序遍历序列,只需要在中序遍历的过程中维护上一个访问的节点和当前访问的节点。如果上一个访问的节点是节点p,则当前访问的节点即为节点p的后继节点。
5.17题目 953. 验证外星语词典
【遍历】依次检测strs中的字符串前一个字符串和后一个字符串在给定的字母表下的字典序即可。
5.18题目 668. 乘法表中第k小的数
【二分】求第几小等价于求有多少数字不超过x,可以遍历乘法表的每一行。
5.19题目 462. 最小操作次数使数组元素相等 II
【排序】所有元素都变成nums⌊len(nums) / 2⌋时,移动次数最少。
5.20题目 436. 寻找右区间
【二分】对区间ntervals的起始位置进行排序,并将每个起始位置intervals[i][0]对应的索引i存储在数组startIntervals中,然后枚举每个区间i的右端点intervals[i[1],利用二分查找来找到大于等于intervals[[1]的最小值val即可,此时区间i对应的右侧区间即为右端点val对应的索引。
5.21题目 961. 在长度 2N 的数组中找出重复 N 次的元素
【数学】如果相邻的x之间至少都隔了2个位置,那么数组的总长度至少为:n+2(n-1)=3n-2,只需要遍历所有间隔2个位置及以内的下标对,判断对应的元素是否相等即可。
5.22题目 464. 我能赢吗
【记忆化搜索 + 状态压缩】考虑边界情况,当所有数字选完仍无法到达desiredTotal时,两人都无法获胜,返回false。当所有数字的和大于等于desiredTotal时,其中一方能获得胜利,需要通过搜索来判断获胜方。
5.23题目 675. 为高尔夫比赛砍树
【BFS】对矩阵中的树按照树的高度进行排序,依次求出相邻的树之间的最短距离。利用广度优先搜索,按照层次遍历,处理队列中的节点(网格位置)。visited记录在某个时间点已经添加到队列中的节点,这些节点已被处理或在等待处理的队列中。对于下一个要处理的每个节点,查看他们的四个方向上相邻的点,如果相邻的点没有被遍历过且不是障碍,将其加入到队列中,直到找到终点为止,返回当前的步数即可。最终返回所有的步数之和即为最终结果。
5.24题目 965. 单值二叉树
【DFS】一棵树的所有节点都有相同的值,当且仅当对于树上的每一条边的两个端点,它们都有相同的值(这样根据传递性,所有节点都有相同的值)。因此,我们可以对树进行一次深度优先搜索。当搜索到节点x时,我们检查x与x的每一个子节点之间的边是否满足要求。例如对于左子节点而言,如果其存在并且值与x相同,那么我们继续向下搜索该左子节点;如果值与x不同,那么我们直接返回False。.
5.25题目 467. 环绕字符串中唯一的子字符串
【DP】定义dp[α]为p中以字符a结尾且在s中的子串的最长长度。
5.26题目 699. 掉落的方块
【暴力枚举】用数组heights记录各个方块掉落后的高度。
5.27题目 面试题 17.11. 单词距离
【一次遍历】从左到右遍历数组vords,当遍历到word1时,如果已经遍历的单词中存在word,为了计算最短距离,应该取最后一个已经遍历到的wor所在的下标,计算和当前下标的距离。同理,当遍历到word时,应该取最后一个已经遍历到的word所在的下标,计算和当前下标的距离。
5.28题目 1021. 删除最外层的括号
【栈】遍历s,并用一个栈来表示括号的深度。遇到‘(则将字符入栈,遇到)'则将栈顶字符出栈。
5.29题目 468. 验证IP地址
【依次判断】ipv4和ipv6分别判断,长度、if包含数字、值范围,是否含前导零…
5.30题目 1022. 从根到叶的二进制数之和
【递归】如果节点是叶子节点,返回它对应的数字val;如果节点是非叶子节点,返回它的左子树和右子树对应的结果之和。
5.31题目 剑指 Offer II 114. 外星文字典
【拓扑排序 + DFS】对于一个特定节点,如果该节点的所有相邻节点都已经搜索完成,则该节点也会变成已经搜索完成的节点,在拓扑排序中,该节点位于其所有相邻节点的前面。一个节点的相邻节点指的是从该节点出发通过一条有向边可以到达的节点。