自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(524)
  • 收藏
  • 关注

原创 LeetCode 2437. 有效时间的数目

【回溯】反正最多也就4位,直接回溯爆搜了。

2023-05-10 10:32:06 355 1

原创 LeetCode 337. 打家劫舍 III

【树上DP】还是选或者不选的问题,但是这个需要在DFS的过程中去处理,所以需要用一个数组来返回当前节点选和没选的最大值。

2023-05-08 15:06:02 253

原创 LeetCode 213. 打家劫舍 II

的唯一不同就是第一个和最后一个需要特殊处理,因此在DP的时候可以分第一个选了和没选进行讨论。如果选了那么第二个和最后一个一定不能选,就是从[3, n - 1] DP;如果没选就是从[1, n] DP。

2023-05-08 14:51:35 247

原创 LeetCode 198. 打家劫舍

【DP】非常经典的需要多少个不连续的DP问题,对于每个房屋要么拿要么不拿,所以定义状态dp[n + 1][2],dp[i][0]表示当前第 i 个房间没有偷,那么他的最大金额就是上一个房间拿或者没拿的;而dp[i][1]表示当前第 i 个房间要偷,那么意味着上一个房间不能偷,所以是 dp[i - 1][0] + nums[i]。

2023-05-08 14:13:00 66

原创 AcWing 4977. 三元组

【前后缀分解】首先题目要求 x < y < z,所以这里是和顺序有关的,如果以第一个数 a[x] 为基准,那么后面 a[x] / k 和 a[x] / (k * k) 的顺序是不一定的,同理以最后一个数为基准也是。所以只能以中间的数 a[y] 为基准,然后统计这个数前面的 a[y] / k 的个数和后面的 a[y] * k 的个数,然后利用乘法原理乘起来。

2023-05-07 22:11:18 70

原创 AcWing 4976. 倍增

【分解质因数】 把每个数写成 pow(2,a) * pow(3, b) * C 那么需要所有的数分解出来的 C 都相等才能通过乘以 2 或者 3 凑成相同的数。

2023-05-07 21:56:43 56

原创 LeetCode 2106. 摘水果

【双指针】 如果固定右端点,那么左端点只会随着右端点向右移动,因此具有单调性。当左右端点之间的距离的最小值大于k的时候,左端点必须右移来缩短这个距离。计算距离时如果都在左侧那么就是起点到左端点的距离,如果都在右侧就是起点到右端点的距离,否则是其中一段折返距离和另一端距离的最小值。【前缀和 + 二分】枚举向左或者向右走的长度就可以计算出能够到达的区间范围,通过前缀和+二分来求这个区间范围内有多少草莓即可。

2023-05-05 19:39:15 95

原创 剑指 Offer 51. 数组中的逆序对

我们知道归并排序是先划分然后再合并,最底层的肯定就是单个元素,所以一开始的时候:(啊不对,还是算一算区间划分吧,第一层[0, 2] [3, 4], 第二层[0, 1] [2] [3] [4], 第一个划分第三层)所以总结下来,这个的精髓就是在归并A,B区间的过程中,如果发现A区间的元素a>B区间的元素b,那么B区间从b开始剩下的元素肯定能和a组成逆序对(在归并过程中a和b都是现存的区间的最顶元素了)。第二层:先合并[7, 5], [6] 再合并 [4], [3];第一层合并[7, 6, 5]和[4, 3]

2023-04-30 16:12:07 943

原创 LeetCode 993. 二叉树的堂兄弟节点

【DFS】DFS的过程中记录父节点和层数即可。

2023-04-24 17:18:04 48

原创 LeetCode 899. 有序队列

【排序+最小表示法】对于k>1的情况,我们可以发现字符串是可以交换前面两个字符的顺序的,例如abcccc在不看cccc的情况下,如果想交换ab的位置,就先把b放在后面再把a放在后面,然后c按照原来的顺序都放在最后就行了。所以这种情况下直接返回最小的就行。对于k==1的情况,就是找这样一个循环字符串的最小表示,直接套最小表示的模板即可。

2023-04-24 17:16:43 57

原创 LeetCode 1147. 段式回文

【双指针 + 贪心】 i从前向后,j从后向前,k从1开始,比较前后缀,一旦匹配到相同的就更新i和j。

2023-04-12 18:59:14 53

原创 AcWing 4956. 冶炼金属

因此我们可以把 V 根据 A / V 和 B 的大小关系分为三部分: A / V > B | A / V == B | A / V < B ,并且从左到右 V 是递增的。所以我们只需要通过二分找到第一个让 A / V = B 的点即可。而左边的答案就是 a / (b + 1) 下取整的最大值 + 1,因为下取整求出的这个数是能使得组成 b + 1 个的最大值,如果在多一点( + 1)的话就只能组成 b 个了。

2023-04-12 14:46:27 118

原创 LeetCode 6359. 最小化数对的最大差值

【二分 + 贪心】二分 [0, 1e9] 的解空间,然后贪心验证,验证时将数组从小到大排序,如果前一个和后一个的间隔

2023-04-10 10:22:22 112

原创 LeetCode 1017. 负二进制转换

【进制转换】和2进制相比的话,偶数位是完全相同的,但是奇数位是由当前位和当前位 + 1 一起组成的。所以当遇到奇数位的时候该位为1,同时需要加上该位的值,然后继续向前转成 -2 进制。

2023-04-06 14:20:05 264

原创 LeetCode 1053. 交换一次的先前排列

【贪心】要想使得数变小,需要前面一个大的数字 arr[i] 和后面一个较小的数字 arr[j] 进行交换。并且为了使交换后的值大,应该让 i 尽可能靠后。所以只要找到 arr[i] > arr[i + 1] 那么这个 i 就是符合要求的。找到这个 i 后要找一个比nums[i] 小的 nums[j],这个 nums[j] 应该尽可能大,如果有多个的话最靠左的更好。

2023-04-05 10:55:06 80

原创 LeetCode 712. 两个字符串的最小ASCII删除和

的扩展,相当于把删除的权值1改成了这里的ascii码,但是dp的思路还是一样的。首先dp[i][j]代表走到s1[i], s2[j]的时候保持字符串相等需要删除的最小权值,那么当s1[i]和s2[j]相等的时候不需要删除,那么dp[i][j] = dp[i - 1][j - 1],否则的话从删除s1[i]和删除s2[j]中选择一种最小的方案,dp[i][j] = Math.min(dp[i - 1][j] + s1[i], dp[i][j - 1] + s2[j]).

2023-04-04 15:57:24 138

原创 LeetCode 583. 两个字符串的删除操作

是求最长的公共的,这个是求删掉的最少的。那么dp过程中如果word1[i]和word2[j]相等,那么就不需要删除,所以dp[i][j] = dp[i - 1][j - 1],否则的话就需要从dp[i - 1][j]和dp[i][j - 1]中删除掉当前的一个字符使得二者相等,也就是dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + 1。【DP】LCS问题的变形,原LCS问题。

2023-04-04 15:51:21 91

原创 LeetCode 2444. 统计定界子数组的数目

2444. 统计定界子数组的数目 【DP】用i0,i1,i2 分别记录不符合规定的( < minK || > maxK )的元素所在位置,minK所在位置,maxK所在位置。遍历当前数组的过程中,如果 i1 和 i2都不为-1,那么能构成的子数组就是min(i1, i2) - i0。

2023-04-04 14:53:38 72

原创 LeetCode 795. 区间子数组个数

如果当前元素处于[left, right]之间的话,那么dp[i][1]更新为max(dp[i - 1][0], dp[i - 1][1]) + 1,并且把dp[i][1]累加到答案中,同时dp[i][0]更新为dp[i - 1][0] + 1;如果当前元素 < left,那么dp[i][0]更新为dp[i - 1][0] + 1,而dp[i][1]仍然是dp[i - 1][1],同时把他累加到答案中。如果当前元素在[left, right] 之间的话,更新 i1。

2023-04-04 14:17:11 62

原创 LeetCode 1638. 统计只差一个字符的子串数目

【DP】用dp[i][j][k]表示当前走到 s[i], t[j] 时,不同字符个数为 k 时的方案数(长度),那么当s[i] == s[j]时,dp[i][j][0] = dp[i - 1][j - 1][0] + 1,dp[i][j][1] = dp[i - 1][j - 1][1];否则,dp[i][j][0] == 0, dp[i][j][1] = dp[i - 1][j - 1][0] + 1。然后把所有的dp[i][j][1]加起来就是答案了。

2023-04-04 10:40:22 82

原创 LeetCode 1641. 统计字典序元音字符串的数目

【DP】dp[i][j]表示当前长度为i,并且以j结尾的字符串的个数。那么转移的时候dp[i][j] += dp[i - 1][k],k ∈ [0, j]。

2023-03-29 10:58:18 46

原创 LeetCode 72. 编辑距离

【DP】 用dp[i][j]来表示让word1[0: i] 和 word2[0: j] 相同需要的最小距离,如果word1[i] == word2[j],那么dp[i][j] = dp[i - 1][j - 1];否则dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1。dp[i - 1][j - 1] 表示先不管当前的,先让前面相同,然后替换word1[i] 让他和 word2[j]相同。

2023-03-29 10:38:11 61

原创 LeetCode 1092. 最短公共超序列

【代码】LeetCode 1092. 最短公共超序列。

2023-03-28 21:15:15 124

原创 LeetCode 1574. 删除最短的子数组使剩余数组有序

【双指针】其实方法一可以只用双指针去优化,还是先找到递增的最大长度,例如左边到了l1,右边从l2开始,那么左侧指针 i 从 0 开始枚举到 l1,去右侧找第一个 >= arr[i] 的 j,当 i 继续向右移动的时候,j 也只能向右移动,j 随着 i 单调变化,所以可以用双指针。【双指针 + 二分】先用相向双指针从两端往中间走找到两侧递增的最大长度,然后枚举右侧去左侧二分查找第一个

2023-03-28 16:02:28 63

原创 LeetCode 435. 无重叠区间

在枚举第 i 个区间的时候,如果intervals[i][0] >= dp[ans][1],那么可以直接把这个区间放到末尾组成更长的。否则二分查找dp中右端点 >= intervals[i][1]的区间 dp[l] ,把他替换成这个区间,从而使以 l 为长度的区间的右端点更小,从而让后面更容易去扩展。不同的是,俄罗斯套娃要求后一个的左端点 前一个的右端点,而这道题要求后一个的两个端点都 >= 前一个的右端点。【DP + 二分】这个题也可以转化为二维的LIS问题,与。

2023-03-25 17:07:45 62

原创 LeetCode 960. 删列造序 III

【DP】把LIS问题扩展到N维了,还是用dp[i]表示当前走到每个字符串中下标为 i 的字符时的最大长度,对于dp[i] 需要枚举 dp[j] j ∈ [0, i),只有当每个字符串的str.charAt(i) >= str.charAt(j) 时才能更新dp[i]960. 删列造序 III。

2023-03-24 17:07:32 40

原创 LeetCode 面试题 08.13. 堆箱子

的简化版,让箱子不能旋转了,还是同样的做法。按照三条边的总和从小到大排序,然后DP。1691. 堆叠长方体的最大高度。面试题 08.13. 堆箱子。

2023-03-24 15:48:21 234

原创 LeetCode 1691. 堆叠长方体的最大高度

的再进阶,变成三维的了。首先需要把每个进行排序,让最大的边当高度,其次对所有的按照任何一个边的方向排序保证一定的拓扑序,然后dp的过程中取[0, i)中符合条件的最大值。1691. 堆叠长方体的最大高度。354. 俄罗斯套娃信封问题。【排序+ DP】这道题是。

2023-03-24 15:42:54 48

原创 LeetCode 1626. 无矛盾的最佳球队

的简化版,也是二维的LIS问题。先按照score或者age排序,然后选出最长递增子序列。需要注意排序的时候都是按照两个的从小到大排的,因为具有相同年龄的队员都可以被选,如果乱排的话会出现这种情况,[3, 4], [3, 2],拥有相同的分数,但是年龄是前者大于后者,所以后面年龄为2的就加不上去了。如果,像信封那道题,规定两个维度都必须严格大于的话,用二分+DP的时候就要从大到小排,来保证同一纬度下只有最小的加入了。1626. 无矛盾的最佳球队。354. 俄罗斯套娃信封问题。【DP】这道题我感觉是。

2023-03-24 15:01:33 41

原创 LeetCode 354. 俄罗斯套娃信封问题

首先我们先按照第一个维度从小到大排序,确保一个拓扑序的稳定,接下来第二个维度按照从大大小的顺序排序。然后按照LIS问题的二分优化方法进行dp,由于第一个维度已经有序,所以这里dp的时候只需要看第二个维度。当env[i][1] > dp[l - 1]的时候把他放进去,这是可能就会有个问题是第一个维度相等。所以之前第二个维度是按照从大到小进行排序的,假如存在[2, 4] [2, 3]这种的,那么后面[2, 3]会触发二分插入的操作来把之前的[2, 4]更新掉。300. 最长递增子序列。【DP + 二分】这是。

2023-03-24 14:43:19 80

原创 LeetCode 334. 递增的三元子序列

这道题的数据范围为5e5,所以必须用贪心和二分进行优化,具体方法为:dp[i]记录长度为 i 的递增序列的最后一个元素的大小,dp必然是单调递增的,在遍历nums的过程中,如果当前nums[i] > dp[l - 1],即大于当前最长序列的最后一个元素,那么就可以把nums[i]放在后面组成一个长度为l + 1的递增序列,否则二分查找第一个 >= nums[i]的元素,将他替换为nums[i],以便后面能更好地组成递增序列。【DP + 二分】这是。

2023-03-24 14:29:14 55

原创 LeetCode 300. 最长递增子序列

否则,我们找到dp中第一个大于等于nums[i]的元素,把他替换为nums[i],这样后面的就更容易组成更长的递增序列。【DP】LIS系列的DP,用dp[i]记录当前以第i个元素结尾时的最大长度,对于当前nums[i]比较nums[j],j ∈ [0, i),如果nums[i] > nums[j],那么取dp[i] = max(dp[i], dp[j]),最后要把dp[i] + 1,也就是nums[i] 自己。在更新dp[i] 的过程中还需要更新最后的答案ans。

2023-03-24 14:16:10 49

原创 LeetCode 1032. 字符流

【字典树】把每个word倒序插入字典树,将流加入到StringBuilder中,因为words的长度最大为200,所以倒序检查后200个字符是否在字典树即可。最多循环 4e4 * 200次。

2023-03-24 13:47:41 74

原创 LeetCode 1626. 无矛盾的最佳球队

【DP】先按照score从小到大排序,score 相同的按照age从小到大排序,dp[i]为当前走到第i个队员时的最大得分,对于当前i寻找[0, i - 1]中age < 当前ages[i]的dp最大值。

2023-03-23 12:29:11 90

原创 LeetCode 6322. 检查骑士巡视方案

这里有个小技巧就是,走日字的验证方式为(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) == 5,因为在整数范围内只有绝对值为2和1的解。【哈希 + 验证】用哈希表来记录grid[i][j] 和坐标 (i, j) 的映射,然后从0开始进行验证。需要注意 (0, 0) 处必须是 0 才行。

2023-03-20 22:45:00 103

原创 LeetCode 6321. 执行操作后的最大 MEX

【取余计数】因为每个数可以+ / - k * value,所以,每个数能组成 (nums[i] % value) + k * value这些数,所以我们可以统计余数的个数,然后每次组成 (0, value - 1) + value * k 这样的数都要消耗一组(0, value - 1)的余数,直到不能组成为止。并且答案肯定在value + 1也就是1e5 + 1这个范围内出现,因为nums的长度也就1e5,所以验证的时候也无需担心超时。

2023-03-20 19:30:00 74

原创 LeetCode 90. 子集 II

一样是需要去重的,还是当前 i > 0 && nums[i] == nums[i - 1] &&!st[i - 1]的时候说明前面的nums[i - 1]是上一层用完之后回溯回来的,这时候需要跳过。【回溯 + 去重】和。

2023-03-20 08:30:00 41

原创 LeetCode 40. 组合总和 II

【回溯 + 去重】先对元素排序,如果当前元素和前一个元素重复nums[i] == nums[i - 1],并且前一个元素nums[i - 1]没有被用过!st[i - 1],那就说明前面那个元素是回溯回来的,这时候如果再选用重复的元素 nums[i]就会重复,所以遇到这种情况需要跳过。

2023-03-19 21:33:53 40

原创 LeetCode 6352. 美丽子集的数目

【回溯 + 剪枝】因为n只有20,所以回溯枚举子集的复杂度只有2 ^ 20,也就1e6,所以检查字符串时复杂度低于100即可。这里可以用哈希表来记录已经用过的数字,如果当前放入的数字 - 2 或者 + 2 的值不在哈希表中才能放。

2023-03-19 20:09:55 78

原创 LeetCode 1625. 执行操作后字典序最小的字符串

【BFS】从开始的s搜所有字符串可能的情况,因为奇数位都是一起变化的,所以最多有10种可能,轮转的话最多也就100种可能,所以BFS爆搜即可。

2023-03-19 20:06:18 46

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除