- 博客(88)
- 收藏
- 关注
原创 187.重复的DNA序列
代码实现时,可以一边遍历子串一边记录答案,为了不重复记录答案,我们只统计当前出现次数为 2 的子串。用一个哈希表统计 s 所有长度为 10 的子串的出现次数,返回所有出现次数超过 10 的子串。3.哈希值等于2时是该子串第一次重复出现,记录到结果中。1.for循环遍历长度为10的子串,通过。2.记录此时子串到哈希表中。
2025-01-30 17:22:41
148
原创 438.找到字符串中所有字母异位词
如果cnts的更大说明出现了p中没有的字符 或者某个字符数量超了,这时需要移动左窗口。使用两个size为26的数组记录p中每个字母出现的次数和遍历时子串的次数。(3)移动左窗口:先算出窗口左边界字符串对应的index 即。,在cnts中减1这个index对应的数量,left++移动。(4)当窗口长度刚好和p的size相等时即可记录结果。2.定义窗口左边界初始值为0,for循环遍历右边界。1.遍历p,更新p的字母次数。
2025-01-30 17:11:19
171
原创 264.丑数II
2.每次从队列取出最小值 x,然后将 x 所对应的丑数 2x、3x 和 5x 进行入队。为了防止同一丑数多次进队,我们需要使用哈希表(数据结构 set )来记录入过队列的丑数。3.对步骤 2 循环多次,第 n 次出队的值即是答案。1.将最小丑数 1 放入队列。
2025-01-30 16:36:30
198
原创 79.单词搜索
(2)搜索下一单元格:朝当前元素的上、下、左、右四个方向开启下层递归。修改为空字符’’,代表此元素已访问过,防止之后搜索时重复访问。递归四个方向的,如果一个方向相邻的不相等,后面的都不用看了。(1)行列索引越界,字符不匹配,返回false;(2)字符串全部匹配,返回true。(1)标记当前矩阵元素:将。(3)还原当前矩阵元素:将。元素还原至初始值,即。
2025-01-19 02:54:20
124
原创 131.分割回文串
(1)判断[start,i]是否是回文串,不是就continue。1.需要一个判断当前子串是不是回文串的函数,使用双指针。(2)如果是回文串,记录到tmp,移动start,递归。2.回溯遍历i,从start开始,
2025-01-19 02:53:41
288
原创 20.有效的括号
1.使用一个哈希表key为右括号,用于后续判断当前碰到的是否是右括号+通过value判断是否有匹配左括号。2.过程:将当前字符到map中查找,碰到左括号入栈,碰到右括号比较value与栈顶元素。如果相等就匹配了一对括号,左括号出栈,不等就returnfalse。最终结果需要判断栈是否为空,如果栈没空说明有剩下未匹配的左括号。
2025-01-19 02:53:10
185
原创 20.有效的括号
1.使用一个哈希表key为右括号,用于后续判断当前碰到的是否是右括号+通过value判断是否有匹配左括号。2.过程:将当前字符到map中查找,碰到左括号入栈,碰到右括号比较value与栈顶元素。如果相等就匹配了一对括号,左括号出栈,不等就returnfalse。最终结果需要判断栈是否为空,如果栈没空说明有剩下未匹配的左括号。
2025-01-19 02:51:27
123
原创 560.和为k的子数组
所以和为k的子数组个数=当前preSum能切掉几个不同和为的preSum-k的数组。和为k的子数组=和为preSum的数组切掉和为preSum-k的数组后剩下的部分。2.更新结果,看这个位置的preSum能切掉几个preSum-k。1.计算每一个位置的preSum。3.更新preSum哈希表。
2025-01-19 02:49:04
120
原创 93.复原ip地址
需要一个pointNum记录已经添加的点的数量,如果已经有三个点,就判断剩余部分是否合法,合法就加入结果集。需要一个start记录当前开始的起点,通过枚举i来遍历start到i的长度。将过程看作向字符串中添加三个".“,并枚举三个”."出现的位置。递归终止条件:有三个点且有剩余部分且剩余部分合法加入结果集。2.非数字字符不合法。3.大于255不合法。
2025-01-19 02:48:25
428
原创 22.括号生成
任意前缀中左括号数量一定>=右括号数量,因此,如果左括号数量不大于n,我们就可以放一个左括号,来等待一个右括号来匹配。如果右括号数量小于左括号的数量,我们就可以放一个右括号,来使一个右括号和一个左括号相匹配。这两个不冲突,都需要回溯。
2025-01-19 02:47:56
130
原创 54.螺旋矩阵
2.其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界。4.若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理。3.判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案。5.不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案。1.设定上下左右边界。
2025-01-19 02:21:06
171
原创 46.全排列 && 47.全排列II
1.回溯终止条件:结果的size=nums的size2.使用一个标记数组记录哪些数据是被用了的3.遍历nums,如果元素已经访问过就跳过4.元素未访问过,向一个排列中添加,标记已使用,继续向下遍历(递归),最后撤销回溯,标记未使用。
2025-01-19 02:20:32
268
原创 39.组合总和 && 40.组合总和II
组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。回看一下题目,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。那么问题来了,我们是要同一树层上使用过,还是同一树枝上使用过呢?
2025-01-19 02:19:58
396
原创 153.寻找旋转排序数组中的最小值
1.二分后mid和最后一个比大小(重要且必须)(1)mid更大,说明mid和mid左侧都是有序的,此时最小值出现在mid右侧,left=mid+1(2)mid小,说明mid和mid右侧都是有序的,此时最小值出现在mid或者mid左侧,right=mid2.left==right时结束循环,返回nums[left]
2025-01-12 18:24:02
120
原创 56.合并区间
1.sort排序nums2.外层i遍历区间,内层j遍历i+1开始的区间记录一个maxEnd,为能合并的区间的最右侧端点值比较j的左端点与之前的右端点(maxEnd),(1)小于等于就是能合并的连续区间,更新maxEnd,移动j看下一个区间(2)大于时循环结束,此时j的位置为下一个可合并区间的第一个元素,记录结果,移动i到j。
2025-01-12 18:23:31
211
原创 33.搜索旋转排序数组
数组是部分有序的也可以使用二分法,改题目每次二分必会最少产生一个有序部分1.设置一个mid,然后看mid左侧和右侧哪个是有序数组2.利用有序的一侧判断target是否在这个闭区间,如果在就继续二分查找,如果不在,下一次二分非有序的部分。
2025-01-12 18:22:53
187
原创 31.下一个排列
标准的 “下一个排列” 算法可以描述为:1.从后向前 查找第一个 相邻升序 的元素对(i,j),满足。此时[j,end)必然是降序2.在[j,end)从后向前 查找第一个满足的k。3.将A[i]与A[k]交换4.可以断定这时[j,end)必然是降序,逆置[j,end),使其升序5.如果在步骤 1 找不到符合的相邻元素对,说明当前为一个降序顺序,则直接跳到步骤 4。
2025-01-12 18:22:22
143
原创 1 .两数之和
1.用哈希表存储数组,key为nums[i] value为index2.再次遍历数组,看哈希表中是否有target-nums[i]
2025-01-12 18:19:41
196
原创 15.三数之和 2
(1)``nums[i]+nums[j]+nums[k]==0`此时记录结果,移动jk,然后对jk去重。(1)``nums[i]+nums[j]+nums[k]>0`此时双指针k偏大,左移动。(2)``nums[i]+nums[j]+nums[k]<0`此时双指针j偏小,右移动。2.外层for遍历i,并对i去重。3.内层while双指针j k。
2025-01-12 09:42:26
337
原创 328.奇偶链表
328.奇偶链表思路:注意不是奇数偶数值的结点大概画个图交替连上进行class Solution {public: ListNode* oddEvenList(ListNode* head) { if(head==nullptr) return nullptr; ListNode* odd=head; //奇数位置的头 ListNode* even=head->next; //偶数位置的头 ListNode* eve
2025-01-12 09:14:08
411
原创 92.反转链表II & 206.反转链表
定义三个指针pre和cur和tmptmp暂时记录cur->next,因为反转时cur的next指针会指向pre,不记录后半段就访问不到了。
2025-01-11 01:25:43
277
原创 143.重排链表
2.从slow结点分出后半部分再reverse,slow->next是新的头。链表分成前后两部分,后半部分反转,再一起穿插放入新链表。1.遍历链表找链表的终点(快慢指针)3.双指针遍历两个链表。
2025-01-11 01:24:41
233
原创 2.两数相加 2
1.遍历两个链表,记录长度2.给较短的链表高位补03.设置flag记录进位4.遍历两个链表,对value进行相加并记录进位设置一个dummy节点来避免头结点的特殊处理(最后返回结果为dummy->next)遍历时每次先计算sum,创建next结点并赋值,判断是否有进位,三个指针移动到next5.最高位相加若还有进位再创建一个结点。
2025-01-11 01:24:09
215
原创 83.删除排序链表中的重复元素 & 82.删除排序链表中的重复元素II
思路:设置一个pre,首先指向dummy,cur指向head1.pre和cur相等时,pre->next=cur->next;
2025-01-11 01:21:48
376
原创 3.无重复字符的最长子串 2
在 C++ 中,std::unordered_map 是一个实现的关联容器,用于存储键值对。要在 std::unordered_map 变量中查找特定的键,可以使用 find()。find() 函数返回一个,指向要查找的键值对。
2025-01-04 00:44:48
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人