
手撕leetcode
tux~
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
重刷leetcode
我打算按照下面的方式重新刷题,毕竟经常出现刷了一段时间就忘了。代码我也打算重新写,并更新代码的完成情况。其它基础知识还没想好怎么处理,毕竟我虽然干了快三年,但是并没有学到啥东西,果然海康的产品开发就是测试和技术支持,layman都能干。1.两数之和:哈希表...原创 2021-10-02 17:24:47 · 399 阅读 · 0 评论 -
518.零钱兑换II
dp数组含义,默认的dp表示这么大的容量能装多少东西,现在问的是这么大的背包装满最多有多少种方法。dp关系,原创 2023-04-24 23:06:11 · 322 阅读 · 0 评论 -
61. 旋转链表
【代码】61. 旋转链表。原创 2023-03-05 19:44:57 · 108 阅读 · 0 评论 -
216. 组合总和 III
这道题还是这个问题,选择了2,剩下的内容就就只有[3,9],不考虑1了,因为是组合,不按顺序来可能会有重复。原创 2023-01-02 12:34:46 · 105 阅读 · 0 评论 -
343. 整数拆分
dp[i]可以用于遍历,j和i-j,分为这个j和(i-j)用dp和不用dp两种。如果用dp,意思就是这个数字需要被拆分。原题的题解中只判断(i-j)是否需要用dp,至于j就固定不用dp,我也不知道为啥,我觉得都得用。DP的话还是比较好理解的。dp[n]表示n这个数字的最大积是多少。我理解的递推表达式和题解有些区别。原创 2023-01-01 15:48:27 · 113 阅读 · 0 评论 -
201. 数字范围按位与
公共前缀是相同的,剩下不同的全用0补充。为啥是这样,我没看证明。就那么几种情况,挨个试一下。原创 2023-01-01 14:53:19 · 104 阅读 · 0 评论 -
572. 另一棵树的子树
如果两个字符串序列化后可以用string表示,我调用strstr函数就可以判断字符串的关系,但是因为每个节点存储的数据非常大,已经大于char能够存储的范围,就只能用vector进行判断。一个vector是否是另一个vector的子集,C++中是没有函数的,只能用KMP判断。例如一棵树只有一个节点叫做12,另一棵树只有一个根节点2,序列化的结果分别是12##和2##,两者之间并没有关系,但是后者却是前者的子串,这是因为12在字符串中本来应该是一个char,但是我这里用了两个字符,就异常了。原创 2023-01-01 12:31:04 · 116 阅读 · 0 评论 -
459. 重复的子字符串
两个字符串相加,删掉第一个和最后一个字符,如果原字符是这个字符的子集,就认为原字符可以由若个相同字符拼接而成,但是我并没看证明过程。原创 2023-01-01 12:21:44 · 96 阅读 · 0 评论 -
79. 单词搜索
这道题我就一个地方需要注意,就是如果数组只有一个元素。原创 2022-12-14 18:35:55 · 113 阅读 · 0 评论 -
90. 子集 II
选这个点是没有限制的,因为1,2选完了,1,2,2还是可以继续选的。不过不选是可能有重复的,要看之前是否选择过,如果有机会选却没用,就说明一定有另一种情况选了带那个带的,因此就不要选了。就说排序的,因为哈希的方法是一样的。这道题两种办法应该都行,因为本来就有空间复杂度,再加一个哈希没区别。一般而言去重有两种办法,我常用的就是哈希,如果能排序可能会更好。输出:[[],[1],[1,2],[1,2,2],[2],[2,2]],机不可失时不再来。输入:nums = [1,2,2]输出:[[],[0]]原创 2022-12-10 16:55:12 · 404 阅读 · 0 评论 -
117. 填充每个节点的下一个右侧节点指针 II
这道题本来可以很简答,一个队列,存储指针和它的行数就OK了,但是这道题的难点在于不用额外空间复杂度。横向看一下,这一行是不是就是一个链表呢?多加一个变量,用来存储第一有有效节点,什么是有效节点呢?就是左右节点中至少有一个不为空的。这个节点为啥不存第一个节点呢?而是存第一个有效节点呢?其实对于这一行来说是没有区别的,但是对于下一行的使用是有区别的。下面介绍第二个变量,叫做pre,每次遍历一个节点,都是让pre的next指向当前节点。既然这样,pre的默认值是无意义的。因为pre的next才是第一个有效节原创 2022-12-07 21:27:01 · 352 阅读 · 0 评论 -
209. 长度最小的子数组
这道题思路不难,但是却调试了几次才对给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]原创 2022-12-06 21:09:54 · 108 阅读 · 0 评论 -
713. 乘积小于 K 的子数组
这个思路就是滑动窗口,弹出的时候+=以这个位置开头的所有结果。退出条件是right到最右边,因此结束的时候也需要再判断一次。示例 1:输入:nums = [10,5,2,6], k = 100输出:8解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。示例 2:输入:nums = [1,2,3], k = 0输出:0原创 2022-12-06 20:48:23 · 139 阅读 · 0 评论 -
986. 区间列表的交集
这道题我第一次做了好久都没搞定,这次一下就ok了。上下两个指针,其实就两种情况,first和second没有交集。如果没有,就让小的那个指针++,如果有交集,就做出这个集合,完了第二个值小的那条链的指针++。原创 2022-12-05 21:14:45 · 129 阅读 · 0 评论 -
162. 寻找峰值
这道题我没啥思路,要注意,-1和n的下标都是负无穷。left和right的意思是[left, right]中至少有一个极大值点。找到一个mid,如果两边的数字都比mid的小,那mid就是结果了。如果左右有任意一侧比mid大,例如是left,那[left, mid-1]中肯定有极大值点,画个图就知道了。峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nu原创 2022-12-04 20:38:07 · 292 阅读 · 0 评论 -
33. 搜索旋转排序数组
思路很简单,先找到那个index,左侧找一下,右侧找一下。总之还是那个宗旨:[0,left-1]和[right+1,n]都是各自排好序的结果,即index不可能在这两个范围。不过很奇怪的是找index的时候nums[left]原创 2022-12-04 19:34:31 · 101 阅读 · 0 评论 -
101. 对称二叉树
这题让我做麻烦了,不过我思路也很对。两颗二叉树如果序列化结果事一样的,那么两个完全一样。如果镜像对称,序列化的时候一个先插入左子节点,一个先插入右子节点。有个代码有点傻,我为了能用要一个函数就解决,用了个傻了吧唧的bool变量。原创 2022-11-29 21:00:31 · 522 阅读 · 0 评论 -
131. 分割回文串
递归的s字符串是不变的,x表示,从[0, x-1]的结果已经出来了,后面需要处理的是[x,n)的。需要注意,这里说的[0,x-1]结果出来,不是所有的情况都有,对于某一次而言,是指前面已经排好了,具体前面是"aa"还是"a"“a”,这个不用管,会有递归来处理,只需要处理好后面的内容就行了。前者有很多办法,O(1)的话,可以用DP,我就不看了,反正回文串我就用manacher处理,虽然复杂度不会有提升(因为递归复杂度会大于N,单纯的这个过程DP复杂度是N方,manacher是N),但是空间复杂度会有提升。原创 2022-11-27 22:48:42 · 143 阅读 · 0 评论 -
368. 最大整除子集
例如9,18,54,90,108,180,360,540,720这个例子,当遍历到90的时候,最长的是9,18,54,但是再往后就不一定了,取决于后的数字,如果后面都是90的倍数,而不是54的倍数,那么如果跟着54来,相当于前面全选错了,例如上面的例子,等到540的,前面是54过来的,还是90过来的都一样,但是到了720,就是90好了。再来一个endfrom数组,标志这个数组是从哪里来的,这样就可以通过endfrom一口气找回去直到endfrom[i]==i的时候截至,说明到头了。的情况中,dp最大的,原创 2022-11-21 22:05:55 · 360 阅读 · 0 评论 -
剑指 Offer II 093. 最长斐波那契数列
现在有三个数字,a,b,c,假设它们时斐波那契数列,那么一定满足a+b=c,a的下标时index_a,b的下标是index_b,c的下标是index_c,那么dp[index_a][index_b] = dp[index_b][index_c]+1。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列)解释: 最长的斐波那契式子序列有 [1,11,12]、[3,11,14] 以及 [7,11,18]。输入: arr = [1,2,3,4,5,6,7,8]原创 2022-11-20 17:18:16 · 296 阅读 · 0 评论 -
88. 合并两个有序数组
为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。首先0~n-1,表示闭区间的n个数字,就是n-1-0+1,而后面的下标是n-2到m+n-1,总共有m+n-1-(n-2)+1=m个数字。输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。输出:[1,2,2,3,5,6]原创 2022-11-20 11:47:32 · 105 阅读 · 0 评论 -
1055. 形成字符串的最短路径
dp[i]=dp[i-1]第二个字符ab时也是,dp[i]=dp[i-1]。给定源字符串 source 和目标字符串 target,返回 源字符串 source 中能通过串联形成目标字符串 target 的 子序列 的最小数量。(例如,“ace” 是 “abcde” 的子序列,而 “aec” 不是)。解释:目标字符串 “abcbc” 可以由 “abc” 和 “bc” 形成,它们都是源字符串 “abc” 的子序列。解释:由于目标字符串中包含字符 “d”,所以无法由源字符串的子序列构建目标字符串。原创 2022-11-19 20:08:05 · 622 阅读 · 0 评论 -
1027. 最长等差数列
回想一下,nums 的子序列是一个列表 nums[i1], nums[i2], …并且如果 seq[i+1] - seq[i]( 0原创 2022-11-19 18:53:27 · 456 阅读 · 0 评论 -
面试题 17.24. 最大子矩阵
返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。链接:https://leetcode.cn/problems/max-submatrix-lcci。和《矩形区域不超过 K 的最大数值和》是一道题,只是稍微有有点区别。给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。解释:输入中标粗的元素即为输出所表示的矩阵。注意:本题相对书上原题稍作改动。输出:[0,1,0,1]原创 2022-11-18 09:38:21 · 88 阅读 · 0 评论 -
363. 矩形区域不超过 K 的最大数值和
首先搞到每个点的前缀和,此时的复杂度就是O(m*n),如果要把所有的矩形子集都判断算一遍,那就是先固定左上角的节点,再遍历右下角的节点,复杂度就是。感觉现在的代码是左开右闭,但是好像并不是,因为这个区间的问题,需要在set中加一个0。左移一下就是左移一列,那么如果我现在从上往下压,一维数组的每一位表示这一列的和,这虽然是一维的,但也能起到二维的效果。给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。m是行,n是列,先遍历矩形的上边界,就是。原创 2022-11-16 21:50:38 · 311 阅读 · 0 评论 -
354. 俄罗斯套娃信封问题
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]输入:envelopes = [[1,1],[1,1],[1,1]]著作权归领扣网络所有。注意:不允许旋转信封。原创 2022-11-13 21:37:23 · 417 阅读 · 0 评论 -
784. 字母大小写全排列
输出:[“a1b2”, “a1B2”, “A1b2”, “A1B2”]返回 所有可能得到的字符串集合。以 任意顺序 返回输出。输出: [“3z4”,“3Z4”]输入:s = “a1b2”输入: s = “3z4”原创 2022-11-12 10:47:45 · 107 阅读 · 0 评论 -
77. 组合
这道题全是抄的,背。原创 2022-11-11 20:43:54 · 127 阅读 · 0 评论 -
617. 合并二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]输入:root1 = [1], root2 = [1,2]注意: 合并过程必须从两个树的根节点开始。输出:[3,4,5,5,4,null,7]原创 2022-11-09 20:56:02 · 88 阅读 · 0 评论 -
567. 字符串的排列
因为为0就删除,不等于0–,等于0就创建,不等于0就++,这个操作对于C++的unordered_map太困难了,反正也说了都是小写字母,就用长度为26的数组表示。子串保证的大小肯定一致,只是内容会不同,那么可以用哈希存储s1,用步长为s1.length()的窗口滑动s2,如果两个哈希相等,就是满足条件。给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。输入:s1 = “ab” s2 = “eidbaooo”输入:s1= “ab” s2 = “eidboaoo”原创 2022-11-08 22:35:15 · 882 阅读 · 0 评论 -
3. 无重复字符的最长子串
给我把这个结构背下来,日日日日日。原创 2022-11-08 21:45:23 · 91 阅读 · 0 评论 -
283. 移动零
一开始想,这么个简单题我搞了这么久,后来仔细想了,这题我不会也正常,思路不对。快慢指针,不等于0的时候快指针向慢指针赋值,等于0的时候,慢指针自己++就行。请注意 ,必须在不复制数组的情况下原地对数组进行操作。输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]输入: nums = [0]原创 2022-11-08 09:24:52 · 101 阅读 · 0 评论 -
279. 完全平方数
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。这道题看起来和整数拆分很像,但是我脑子抽了,就非得用那个方法来处理,结果死得很惨。并不是那种方法不能做,而是挺坑的。dp[n]表示以n结尾时的结果。解释:12 = 4 + 4 + 4。写代码的时候可以不用开根号处理。解释:13 = 4 + 9。原创 2022-11-06 22:11:19 · 172 阅读 · 0 评论 -
343. 整数拆分
因为max类计算的时候,会自动算到dp[i],换个说法哈,4=1+3,还可以4=3+1,就是说会有i=1,i-j=3,也会有i=3,i-j=1,所以只有一次for就行了。比如n==4的时候,1+3,可以是1*dp[3]或者1*3,dp[3]表示3可能是由其它数字组成的,例如1+2=3;给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。解释: 2 = 1 + 1, 1 × 1 = 1。原创 2022-11-06 22:02:47 · 104 阅读 · 0 评论 -
72. 编辑距离
因为当word1结尾添加一个字符后,这个字符一定是和word2结尾的字符是相等(这样效率最高),两个是相等的,就可转为删掉word2结尾的字符。这是递归,递归转换为dp,两个参数如果是int就是直接的二维矩阵,但是是string就没法直接搞成矩阵,横纵坐标就是word1和word2的长度。先用DP考虑这么多种情况,可以总结为几种情况,如果word1.back()==word2.back()就可以递归变成。word1结尾的字符被改成和word2结尾相同的字符,也相当于和结尾字符相等是的情况。原创 2022-11-06 19:06:12 · 261 阅读 · 0 评论 -
1143. 最长公共子序列
创建数组的时候多一位,就是(m+1,n+1)的数组,其中第0行和第0列都是0,因为0字符串和text的几位放一起都是0。这道题和最长回文子串类似,dp[i][j]表示 text1[0:i] 和 text2[0:j]的最长公共子序列的长度。只不过最长回文子串是针对一个字符串的,这个是针对两个字符串的。状态转移方程是不是也和回文子串非常相似。原创 2022-11-06 18:03:57 · 118 阅读 · 0 评论 -
392. 判断子序列
归并的merge过程。原创 2022-11-06 17:14:21 · 70 阅读 · 0 评论 -
376. 摆动序列
相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8)。例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。输入:nums = [1,17,5,10,13,15,10,5,16,8]原创 2022-11-06 11:55:35 · 90 阅读 · 0 评论 -
300. 最长递增子序列
dp[i]表示有i个字符时最长递增子序列的最小末尾。长度为i的最长递增子序列可能有多个,但是最小末尾只能有一个。例如12378,长度为4的有1237和1238,但是最小的就是7。这么做的目的是为了能让每次更新dp的时候能用更高的效率。传统的dp手段每遍历一次就会遍历一次dp数组,但是用这种最小末尾的可以用二分的方式更新这个dp,因此复杂度就变成了nlogn。原创 2022-11-06 10:00:44 · 127 阅读 · 0 评论 -
322. 零钱兑换
【代码】322. 零钱兑换。原创 2022-11-05 21:12:48 · 93 阅读 · 0 评论