- 博客(25)
- 收藏
- 关注
原创 代码随想录day29
思路:由于5块的不用处理,10块的只用判断有没有对应的5块找零就可以,需要重点判断20的能不能找零,因为20有两种找零方式,分别是5+10和5+5+5;而10也可以用5找零,因此5块更加万能,分别对两种情况进行处理即可。思路:分别记录当前油箱剩余的总油量和到达下一个加油站剩余的油量,如果总油量小于0则一定到不了下一个加油站;如果到达下一个加油站剩余油量小于0说明得从下一个加油站继续判断,索引+1。思路:需要判断左右的大小,因此需要遍历两次,从左遍历并且从右遍历。
2024-07-31 22:32:48
465
原创 代码随想录刷题day28
思路:每次维护能到达的最远距离,如果最远距离包含了数组的最后一个下标就返回true,注意i每次只能在far的范围内移动,因为far是i能到达的最远距离。思路:与前一个不同的是需要统计最小跳跃次数,考虑当i到达当前能跳到的最大距离后,跳跃次数+1,然后从far的地方重新开始跳。思路:排序后将最小的数进行翻转,然后再次排序,得到的就是最大数组和。思路:只用将相邻的差值为正的存储起来,然后求和。
2024-07-30 11:26:52
355
原创 代码随想录day27
思路:使用动态规划的思想,从第一个数开始,往后遍历数组,每次加上一个遍历得到的数,然后max取最大值。思路:优先把最大的饼干分配给胃口最大的人,然后将两个数组都从后往前遍历。思路:遍历一遍数组,并且比较相邻的差值,需要判断三次不同的平坡情况。
2024-07-30 09:29:33
395
原创 代码随想录day24
思路:需要注意使用vector<bool> sort来存储某个元素是否被选择过,然后在回溯过程中,每次插入到path前需要设置其为true,表示马上会选择该值;思路:定义非递减序列函数以及path的长度大于1作为结束判断的条件,用哈希set去重,重点是res插入path路径时,不要用return,因为要取树上的所有节点。思路:和上题不同的是数组会出现重复的元素,因此结果需要去重,用哈希set存储被选择过的数组,如果被使用过则跳过,否则执行插入以及bool操作。
2024-07-27 10:52:44
626
原创 代码随想录刷题day23
思路:分三步,第一步是递归回溯,判断条件是点的数量,如果数组有3个点说明是一个完整的数组,然后判断是否是有效IP地址,需要注意的是字符串的操作以及回溯时要对点的数量进行修改,然后就是对字符串的判断,以及对字符串的数字和区间判断。思路:与上一个题不同的是需要判断一下出现重复数组的情况,用一个哈希set存储只出现一次的元素,如果下一次出现相同的元素就跳出循环,不执行插入操作。思路:由于需要把空集也算上,因此回溯算法开始就要将path路径加入都res里面,然后当index遍历的数组索引超过限制后就退出。
2024-07-26 22:07:51
578
原创 代码随想录刷题Day22
2.对index的使用,本题需要考虑选取重复元素的特殊情况,在递归时,不需要i+1,这样会去重,直接使用i就好了。思路:本题不仅要求对最终元素去重,还要对结果数组去重,首先需要对数组排序,便于后续进行相邻元素选取的去重操作,然后利用sum加对应元素来插入元素,回溯过后用sum减对应元素来去除元素。思路:字符串的分割本质上是组合问题,需要注意的是回溯过程中的return条件是当分割的位置超过了字符串的大小说明存在一组分割数据,然后就是判断字符串是否为回文串,再进行回溯。
2024-07-25 16:20:42
504
原创 代码随想录刷题Day21
思路:重点在于构造一个和电话上面的号码一一对应的映射表,因为如果直接对字符串digits进行遍历,获得的是字符,无法与数字结合。然后通过设置的index字符表索引来获得对应的号码的字符串,然后就是套模板。需要注意index在所有回溯算法中的作用基本都是用来从第一个组合尝试获得所有组合,利用递归和回溯。思路:首先判断终止条件,当path路径中的长度与k相同则表示一定到达叶子结点,之后套用模板秒杀。思路:大体思路同上,主要是需要提前获得组合的和以及判断条件需要更改。回溯法解决的都是在集合中递归查找子集,
2024-07-24 16:08:09
532
原创 代码随想录刷题Day20
思路:可以参考从中序与后序遍历序列构成二叉树的做法,本质都是将数组转化为二叉树,只不过本题已经将数组排序,且直接在当前数组上切割就可以。思路:重点是修剪某个节点时不需要重构二叉树,只需要将当前节点的右节点拼接到上个节点的左节点或者当前节点的左节点拼接到上个节点的右节点。思路:直接在原二叉树上递归加值,先右遍历递归右子树,然后将sum存储起来赋给对应的节点,然后递归左子树。
2024-07-23 22:20:42
379
原创 代码随想录刷题Day19
思路:先通过递归找到需要插入节点的祖先节点,然后通过指针比较新插入的节点值和该祖先节点的大小,若是新插入的节点更大就插入到右边否则就左边。思路:可以看做特殊的普通二叉树的最近公共祖先解题思路,通过递归左右子树,当左子节点不为空且右节点不为空,则返回祖先节点。
2024-07-22 23:08:17
213
原创 代码随想录刷题Day18
思路:递归查找左右子树,如果两个节点都不为空,则说明上一个节点是祖先节点,如果只有一个不为空说明两个节点在一个子树,返回不为空的那个节点,如果两个节点都为空,说明没有找到节点。思路:先层序遍历将所有节点存储起来,然后从小到大排序,再将两两之间的差值储存起来,再排序,最后第一个数就是最小的绝对值。
2024-07-21 22:45:43
175
1
原创 代码随想录刷题Day17
思路:类似二分查找,比较当前节点和val,若是当前节点更大就往左去找,否则就往右,cur存储的就是遍历的子树节点。思路:由于二叉搜索树左边的都比右边的小,然后转化为有序数组后,除去根节点,其他的数都是从小到大排列。思路:主要是何时递归,以及当有节点为null的时候的处理。前序中序和后序都可以。思路:递归进行对应子树的分割,类似中序和前序构造二叉树。
2024-07-19 21:50:00
378
原创 代码随想录刷题Day16
思路:难点在于如何递归以及如何设置递归的终止条件,如图所示,在后序遍历中的最后一个节点就是root节点,然后其在中序遍历的位置正好处在左右子树的中间。将中序数组切割,切割点是root节点所在的位置,左边放进之后的左递归,右子树放进后面的右递归。此时后序数组也要同步切割,切割点正好是中序数组的左子树的长度,于是将切割后的左右子树和中序数组一起进行最终的递归。思路:注意递归的终止条件,只有当找到叶子结点且路径和等于目标才返回真,否则为假,递归左右子节点。
2024-07-18 21:21:52
373
原创 代码随想录刷题Day15
思路:重点是判断是否下一节点是左叶子结点,不是的话就迭代寻找下一个可能的叶子节点。思路:目的是找到左右子树不平衡的节点。思路:直接层序遍历,查找节点的个数。
2024-07-17 22:57:59
333
原创 代码随想录刷题day14
主要注意,后序遍历可以在前序遍历基础上更改为正常的中,左,右插入,最后再反转res,就能得到左,右,中的顺序。思路:和求二叉树的最大深度类似,通过层数判断深度,往下遍历时,最先找到的叶子结点一定是深度最小的节点。思路:需要翻转整个左右子树,然后分别判断内子树和外子树的值是否相同,可以用栈或者队列存储每层的节点。思路:翻转整个二叉树只需要把每个子树翻转,即将每个节点的左右孩子翻转,就可以达到翻转整个二叉树。需要先把左子树的所有节点从左至右遍历,最后遍历中节点和右节点。前序遍历(中,左,右)
2024-07-16 15:59:32
547
原创 代码随想录刷题day13
判断方法:从根节点的遍历顺序查找,前序遍历从根节点开始,根,左,右;中序遍历从左下节点开始 左,根,又;后续节点顺序为 左,右,根。需要注意:二叉树的构造函数不是left和right左右节点,而是使用数组存储的children指针。二叉树的高度:从根节点到最远节点的边的长度。节点的高度:该节点到最远节点的边的长度。节点的深度:该节点到根节点的边的长度。节点所在层:从顶至底递增,顶层为1。节点的度:拥有的子节点的数量。根节点:没有父节点的节点。叶节点:没有子节点的节点。边:连接节点之间的线段。
2024-07-15 22:56:39
549
原创 代码随想录刷题day11
思路:由于需要获得最大值,考虑使用单调队列,定义队列的pop()函数:每次将k个元素中的最大值放在队列的出口,这样每次弹出的都是队列中的最大值;定义push()函数:如果即将插入进来的元素比队列出口的原最大值大,那么就将原先的比新val小的元素全部弹出,然后把新的val放在队列的出口;思路:比较有难度,需要考虑使用小根堆,而不是大根堆,主要是使用大根堆只能取出每次最大的元素,对于元素的频率无法处理,如果用小根堆的话,可以将频次最小的移出去,只在堆内留存k个元素,全是频率最大的元素。
2024-07-14 14:43:44
489
原创 代码随想录刷题day10
最后是右括号没有对应的左括号匹配,右括号更多。先遍历字符串,然后将左括号对应的右括号依次插入栈中,每次将括号字符和栈顶元素匹配,如果成功匹配那么就弹出栈顶元素,然后继续遍历;思路:碰到元素匹配的问题需要优先考虑栈的运用,遍历字符串,并往栈输入,如果栈顶元素和即将插入的元素相同就直接弹出栈顶元素,不然就继续插入。思路:将队列的队头元素依次弹出插入到队尾,只留下一个元素,此时弹出的队头元素顺序就是栈的top的顺序。思路:由于栈是先入后出,队列是先入先出,因此需要两个栈,一个用作输入,一个用作输出。
2024-07-12 11:30:51
1110
原创 代码随想录刷题day09
删除多余空格:定义快慢指针,快指针用来遍历原字符串,慢指针用来匹配去除空格后的快指针。最后将整个字符串翻转,并根据空格的位置,将单词逐个翻转。思路:需要考虑三件事:1.翻转整个字符串2.删除多余的空格,包含首尾的和中间冗余空格3.将每个单词翻转。思路:先将整个字符串翻转,然后根据k的位置进行前后两部分的分别翻转。
2024-07-11 21:38:42
831
原创 代码随想录刷题day08
思路:先开辟一个包含了替换数字后的最大数组,然后从后往前依次填充,需要注意如果从前往后填充,每次填完后面的数字都要移动,复杂度是n^2。其次需要注意old和new指针应该同时处于相同长度的数组中进行移动否则有索引溢出的风险。思路:直接利用replace函数,替换数字s.replace(索引,需要替换的元素长度,需要替换的值)思路:定义pos为当前的元素下标,pos每次移动2k个单位,然后判断剩余数组长度和k比较。思路:分别从头从尾遍历,双指针逼近中间元素,然后左指针和右指针的元素对换。
2024-07-10 16:39:39
642
原创 代码随想录刷题day07
先将数组排序,获得-2 -1 0 0 1 2,仍然从数组的首位开始,将-1作为额外的参数j在首位到左指针之间移动,假如定义第一个0位左指针,最后一个位置为右指针,则当左指针因为和小于target而右移时,参数j次数选取的范围会随之增加,因此在三数之和上多加一重循环,用于选择额外的加数。最后将所有满足条件的和的个数相加。思路:利用哈希数组结构存储26个单词,然后对mag数组储存所有字母出现的次数,如果ran数组中对应的字母出现次数少于mag,则ran数组中一定有字母无法被表示。
2024-07-09 16:06:09
511
原创 代码随想录刷题day06
思路由于本题的数据限制较小,因此可以考虑在哈希性质下用数组做,先将26个字母存储在数组中,然后将字符串s的所有字符存储到数组中,对应数组下标为0的地方存储'a',25的地方存储'z',然后将字符串t的字符对应相减,最后判断是否数组的所有元素和为0。3.映射 unordered_map,当需要考虑元素的值和索引时,考虑使用hash map,通过键值对找到需要的元素key:数据元素,value:索引下标。当题目给定的数据限制不大时,使用数组的效率更高,key存储数组的元素,value存储该元素的下标。
2024-07-08 14:22:48
745
原创 代码随想录刷题day04
如图所示,当fast和slow指针相遇时,slow指针走了x+y的距离,fast指针走了x+y+n(y+z)的距离,因为fast指针多走了n个环的距离,又因为fast的速度是slow的2倍,因此2(x+y)=x+y+n(y+z),通过移项可以得出x = (n - 1) (y + z) + z。考虑最理想的状态,fast只多走了一圈就和slow相遇,则n=1,此时x=z,也就是说如果两个指针一个从head出发,一个从相遇的节点出发,则他们以相同的速度一定会在环的入口节点相遇。
2024-07-07 21:12:40
560
原创 代码随想录刷题day03
思路:如果直接在原链表上面进行翻转,则需要将原head指针变成NULL,因此首先定义两个指针分别指向head和NULL,然后一个空链表用于储存需要每一次需要反转的元素。思路:先创建一个哑结点,用于处理可能存在的头结点需要删除的情况,然后遍历整个链表,如果碰到需要下一节点需要删除,就直接让当前节点指向下下个节点,最后返回链表。3.建立哑结点可以不用单独考虑对头节点的增减,使后面的所有节点的操作逻辑相同。5.增删操作需要将原链表中的某条链删除,指向新的节点后再指向原节点后面的元素。
2024-07-05 10:03:05
443
原创 代码随想录刷题day02
此时窗口为动态向右滑动的过程,当i到达右边界,而区间内的sum仍然大于target,就需要继续移动窗口左端点,此时区间长度逐渐减小,最后跳出sum>=target的条件后获得的length即为最小区间长度。1.定义l=0为窗口的左端点,定义累计和sum用来和target比较,从数组的第一个元素i=0开始累加,直到sum >= target,此时窗口的长度为i-l+1,需要判断是否为最小长度,因此定义length用来存储每次sum判断的区间长度。//l是窗口的左端点,i是窗口的右端点。
2024-07-03 20:27:28
1266
原创 代码随想录刷题day01
2.当区间为左闭右闭,当r和l隔得很近,mid采用向下取整可能会导致死循环,因此采用上取整mid=(l+r+1)/2,并根据mid的性质,更新对应的区间大小。1.当区间为左闭右开,此时mid = (l+r)/2,当mid满足红色区域的性质时,根据target的大小,更新对应的左右区间。3.判断当l=0时是否等于val,如果相等则把最后一个元素给l=0,然后重复判断。1.采用双指针,左边为l=0,右边为r=num.size()
2024-07-02 23:29:53
1386
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人