![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
ooold_six
这个作者很懒,什么都没留下…
展开
-
Leetcode 2065. 最大化一张图中的路径价值(DFS / 最短路)
容易想到,从0点出发DFS,期间维护已经走过的距离(时间)和途径点的权值之和,若访问到0点则更新答案,若下一步的距离与已走过的距离和超出了maxTime,则不能向下继续DFS。注意到,当判断一个点是否可以继续深入时,可以考虑的一种剪枝方式是,向该点前进后,若剩余的时间不足以返回0点,则不必向该点DFS。该问题转换为,判断x点回到0点的距离是否超过maxTime - time,即为0点出发的最短路问题,使用Dijstra算法实现。,若后续又一次访问到该点,加0不会影响最终结果,省去vis数组的操作。原创 2024-07-01 22:04:52 · 412 阅读 · 0 评论 -
Leetcode 2663. 字典序最小的美丽字符串 (贪心)
因此不妨令 i 指针向右移动,移动后再回过头向左检查,也就是说, i 向右移动至 j 后,s[ j ]和s[ j-1 ]之间的判断即是s[ i ]和s[ i+1 ]之间的判断,由于变动位置左侧始终满足美丽字符串,因此我们在将 i 指针不断右移的过程中,如果移出了字符串长度,即说明已经判断完毕,当前串符合要求。简化回文串的判定,从缩短判定长度来入手,考虑其定义和特点,如果一个回文串长度较长,那么将它的首尾分别拿去一个字符,它仍然是一个回文串,重复操作后,这个回文串会缩减为长度为2或3的回文串。原创 2024-06-22 23:15:58 · 253 阅读 · 0 评论 -
Leetcode 2713. 矩阵中严格递增的单元格数(DFS DP)
另外注意,存在相同元素,此时计算dp时不应更新rowMax,违背了rowMax的定义“该行内存在一点,以其为起点所答的最远距离为rowMax[ i ],dp[ i ] [ j ] = rowMax + 1”,因为对于同样的元素来说,他们之间是不可达的,因此对于相同元素来说,此时更新rowMax会导致从值k移动到值k 的情况发生。使用mem[ i ][ j ]记录坐标(i, j)位置所能跳跃的最大距离,在进入DFS后,若这个点已经计算过,即mem[ i ][ j ]非0,则直接取用。原创 2024-06-20 16:30:55 · 1162 阅读 · 0 评论 -
Leetcode 135. 分发糖果(问题分解)
注意的是,此时nums并非全1的初始化状态,而是已经计算过的数组,若ratings[ i ] > ratings[ i+1 ]发生,而此时nums[ i ] > nums[ i+1 ]已经满足,则无需再次分配糖果,否则同理左遍历为nums[ i ]赋值。从左向右考虑ratings大于左侧,即ratings[ i ] > ratings[ i-1 ]情况,此时令 i 处的糖果数nums[ i ]直接赋值为nums[ i-1 ] + 1即可满足条件。原创 2024-06-19 14:50:38 · 400 阅读 · 0 评论 -
Leetcode 522. 最长特殊序列 II (判断子序列 优化)
如子序列“abc”不是“qwerty”、“asdfgh”、“zxcvbn”的子序列,那么将“abc”任意扩充为“axbycz”,也必定不是其他字符串的子序列。注意到,如果一个str的子序列满足条件“不是其他字符串的子序列”,那个这个子序列无论如何扩充,扩充后的子序列也必定不是其他字符串的子序列。根据特殊序列的定义,枚举出每个 strs[ i ] 的所有子序列,再将这个子序列与strs中的其他串比较判断。由此问题转化为,判断str[ i ]是否是其他strs的子序列,找出最长的一个str[ i ]返回长度。原创 2024-06-18 12:06:32 · 473 阅读 · 0 评论 -
Leetcode 2786. 访问数组中的位置使分数最大(DP 优化)
对于 nums[ i ] 来说,该位置的分数取决于前方的序列分数,分为上一个选择是奇数和偶数两种情况,只需max0、max1来分别记录前方的奇偶两种情况最值即可计算出当前位置的分数最值。计算max0/1的两种可能时,即使有可能异性-x后的分数更大,但由于存在同性计算 — 两个正数相加,因此max0/1的值必定会增大,直接将cur赋值给max0/1。避免思维误区,计算cur时考虑的不是选或不选的两种情况,而是必定选择 nums[ i ] 作为序列最后一个元素时,取前方奇偶两种可能所获得的分数哪一种更大。原创 2024-06-15 12:07:26 · 299 阅读 · 0 评论 -
Leetcode 45. 跳跃游戏 II(DP 双指针)
当 l r 相遇即区间遍历结束后,将该区间内可达的最远距离maxPos作为下一次跳跃的区间右端点 r ,此时跳跃一步。使用dp [ ] 记录每个位置可达的最小步数,每到达一个点时,更新该点所能跳跃区间内的所有点的dp值。双指针 l r 表示目前可达的区间左右端点,遍历区间维护一个可达的最远距离maxPos。当 r 可以到达边界时,即结束遍历。原创 2024-06-13 12:22:51 · 390 阅读 · 0 评论 -
Leetcode 3040. 相同分数的最大操作数目 II(记忆化搜索)
使用memo[ n ][ n ]数组记录已经进行过的计算,memo[ l ][ r ]表示 l 和 r 区间的最大操作数,若这个区间的最大操作数已经存在,则无需再次dfs下去,直接获取memo值即可。若该区间memo不存在,则dfs后将值存入memo[ l ][ r ]每次操作给出三种选择,根据三种选择分别进行dfs。,这两种操作后的剩余区间是相同的)dfs中有大量重复操作。原创 2024-06-09 10:31:04 · 245 阅读 · 0 评论 -
Leetcode 54. 螺旋矩阵(二维数组移动坐标)
使用dirs和dir计算下一个将要使用的新坐标,若越界或碰壁,则将dir修改,获得正确的新坐标。常用思路,使用二维数组dirs[4][2]进行坐标的上下左右四个方位移动,简化代码。定义一个int型dir来记录方向,0123分别代表右下左上。当越界或碰壁已访问的位置后,修改dir并计算下一个位置。(也常用dirs[8][2]获取坐标的周围8个位置)使用vis数组记录该位置是否已经被访问。否则根据原dir计算下一个位置。原创 2024-06-07 16:45:09 · 297 阅读 · 0 评论 -
Leetcode 459. 重复的子字符串(周期性)
考虑到如果一个子串长度为 i ,那么原串任意一个位置的字符移动 i 位后应仍是这个字符,若判断至原串结尾仍满足这个条件,则说明该串可以由开头起长度为 i 的子串重复构成。如果直接使用选择子串加移动比较的方法会及其繁琐且浪费时间。类比一个周期性函数的图像,即f(x) = f(x+T)原创 2024-06-05 10:07:46 · 226 阅读 · 0 评论 -
Leetcode 66. 加一(模拟位运算 优化)
找 digit = 9 即为找 digit + carry = 10,直接改0。极端情况下全数组为9,加1后全数组为0,因此新建n+1长度的数组,首位设为1。使用carry位模拟位运算,carry为0或1判断终止或是进位。只需反向遍历即可,无需逆置数组。原创 2024-06-03 11:36:06 · 218 阅读 · 0 评论