自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第四十六天

2.确定递推公式:如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。1.确定dp数组以及下标的含义:dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。3.dp数组如何初始化:dp[0]一定要为true,否则递推下去后面都都是false了。

2023-06-16 00:59:45 82

原创 代码随想录算法训练营第四十五天

1.确定dp数组以及下标的含义:爬到有i个台阶的楼顶,有dp[i]种方法。2.确定递推公式:dp[i] += dp[i - j]3.dp数组如何初始化:既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。4.确定遍历顺序:target放在外循环,将nums放在内循环。(排序)

2023-06-11 03:54:36 461

原创 代码随想录算法训练营第四十四天

3.dp数组如何初始化:因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);1.确定dp数组以及下标的含义:dp[j]:凑成总金额j的货币组合数为dp[j]2.确定递推公式:dp[j] += dp[j - coins[i]];2.确定递推公式:dp[i] += dp[i - nums[j]];5.举例推导dp数组。

2023-06-08 01:30:17 94

原创 代码随想录算法训练营第四十三天

思路:尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小1.确定dp数组以及下标的含义:dp[j]表示容量为j的背包,最多可以背最大重量为dp[j]。2.确定递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);3.dp数组如何初始化:既然 dp[j]中的j表示容量,那么最大容量(重量)是多少呢,就是所有石头的重量和。要求的target其实只是最大重量的一半,dp[j]都初始化为0。

2023-06-07 01:35:42 76

原创 代码随想录算法训练营第四十二天

举一个例子:物品0的重量weight[0] = 1,价值value[0] = 15 如果正序遍历 dp[1] = dp[1 - weight[0]] + value[0] = 15 dp[2] = dp[2 - weight[0]] + value[0] = 30 此时dp[2]就已经是30了,意味着物品0,被放入了两次,所以不能正序遍历。递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);遍历物品或者背部都可以。

2023-06-02 00:42:20 75

原创 代码随想录算法训练营第四十一天

2.确定递推公式:1.j * (i - j) 直接相乘。2.是j * dp[i - j],相当于是拆分(i - j),递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});4.确定遍历顺序:首先一定是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。

2023-05-29 01:10:24 73

原创 代码随想录算法训练营第三十九天

4.遍历顺序这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。3.初始化 dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。1.dp数组下标的含义dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。2.递推公式dp[i - 1][j] 和 dp[i][j - 1]。

2023-05-28 04:06:22 363

原创 代码随想录算法训练营第三十八天

2.确定递推公式:dp[i] = Math.min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);2.确定递推公式:dp[i] = d[i-1] + dp[i-2],等于当前位置的台阶 = 前两阶的方法(爬2步) + 前一阶的方法(爬1步)1.确定dp数组(dp table)以及下标的含义:dp[i] = 当前台阶的方法数。2.确定递推公式:dp[i] = d[i-1] + dp[i-2]3.dp数组如何初始化: dp[1] = 1;

2023-05-25 02:24:40 127

原创 代码随想录算法训练营第三十七天

贪心:采用后序遍历,当出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9。此时strNum[i - 1] strNum[i]是当前最大数,依次类推到第一个数就能得到最大值。

2023-05-12 00:51:43 66

原创 代码随想录算法训练营第三十六天

按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了左边界排序我们就是直接求重叠的区间,count为记录重叠区间数。使用:452.用最少数量的箭引爆气球思路,按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。

2023-05-11 01:42:11 61

原创 代码随想录算法训练营第三十五天

所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

2023-05-09 01:07:53 182

原创 代码随想录算法训练营第三十四天

暴力:循环k次,每次循环时先排序,然后把最小的一个数变为她的反数,最后累计和即可。

2023-05-08 00:35:03 150

原创 代码随想录算法训练营第三十二天

暴力:因为是非负整数数组,只有当元素为0时才可能达不到最后一个元素,因此判定元素为0时,判定前面的元素到达的范围是否能大于元素0的索引长度,如果能则说明可以到达最后一个元素,否则不可以。

2023-05-07 19:53:37 110

原创 代码随想录算法训练营第三十一天

贪心:与上同理,只是以最大的饼干满足最大胃口的孩子,如果满足不了则孩子--,知道满足时双方--,当遍历完小孩数组后,得到满足的xia。思路:拿最小的饼干分给胃口最小的,如果满足就移动,否则只移动饼干数组,遍历完某一数组时就能得到满足的孩子个数。同时使用result接收最大的和,当遍历完成后,然后返回result即可。

2023-05-06 01:28:52 76

原创 代码随想录算法训练营第三十天

1、回溯1.因为会有起点出发再回到起点情况,使用Map<起始机场,Tree<目的机场,次数>>来避免循环,TreeMap使用字典排序返回最小的行程组合2.当次数>0时,则代表还有票,否则没有目的地的票3.当票数==目的数(票数+1)时则代表走完所有表,即返回当前路径即可。

2023-05-05 02:10:55 62

原创 代码随想录算法训练营第二十九天

2.还需要对其去重,那么我们使用set集合对其当层去重,如果当层已经存在该元素,那么就跳过,否则继续。下面写法是把set集合转出int写法,模拟hash的用法。1.排列和组合不一样,只和元素顺序有关,因此需要used数组来辅助判定是否已经使用过的,如果使用过就跳过,否则继续。1.也是求组合问题,但是需要单调递增,因此需要把path最后一个元素和需要加入的元素做比较,符合就继续,否则就跳过。1.使用used去重类型组合2used用法一样。1、回溯+used去重。

2023-05-04 02:15:04 99

原创 代码随想录算法训练营第二十八天

1、回溯---与组合问题类似相比只是把路径上的各个点都需要收集。1.和分割回文字符串类型,不过检测是否是有效ip是个难点。1、回溯---与上述的一样,不过加入树层去重逻辑即可。

2023-05-04 00:02:59 86

原创 代码随想录算法训练营第二十七天

1.使用used来表示是否有使用过该节点,当i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false,则为重复,因此需要去重,下startIndex同理。1.确定函数参数candidates, target, index, sum分别为整数数组,目标和,开始索引,累加和,used数组。1.确定函数参数candidates, target, index, sum分别为整数数组,目标和,开始索引,累加和。

2023-05-01 09:38:26 113

原创 代码随想录算法训练营第二十五天

1.使用回溯算法,收集和为n的k个数组合,那循环的条件则为9-(k-path.size)+1。3.当path达到k时也返回,且判定目标和是否与收集和一致,如果一致则收集到result中。2.使用index指向输入字符串的位置,当前字符串指向的字符通过映射表中获取映射字符。3.遍历映射字符,加入到路径中,继续递归映射。2.当收集的和大于目标和时则返回。4.终止条件为i == 字符长度。

2023-05-01 06:51:38 67

原创 代码随想录算法训练营第二十四天

3.单层逻辑:每次循环时加入当前元素路径,再进行递归加入剩余集合元素,startIndex就是用来限制剩余集合元素个数的,递归回来后需要做回溯操作,不然下次递归时就加上前一次的结构。1.确定函数参数:n,k,startIndex分别为n为集合数,k为组合个数,startIndex为循环开始数。2.终止条件为: 当收集的元素==k时则终止。

2023-05-01 03:38:55 82

原创 代码随想录算法训练营第二十三天

1.因需要构建平衡二叉搜索树,因此数组中间节点构造根节点才能构建平衡二叉搜索树,因此构建已中间节点的二叉搜索树,同理继续构建左子树和右子树即可。1.因需要裁减给定的最小边界low 和最大边界 high。所以当小于最小边界时,应继续判定该树的右子树是否有符合边界的值,反之同理。1.累计数其实是:右中左构建,将当前节点和上一个节点的值相加即可。

2023-04-30 19:28:35 122

原创 代码随想录算法训练营第二十二天

5.左右都不为null---把目标节点的右子节点作为新的节点填完原位置,那么目标节点的左子树就需要放在目标节点的右子树的左子节点的左子节点的...,知道为null的上一个左子节点。1、递归:利用二叉搜索树特点,要插入的节点只能是叶子节点或者有一侧为空的非叶子节点,那么确定不会修改树结构,就可以找到适合目标值的父节点插入即可。3.目标指的节点左子节点不为null,右子节点为null---返回目标节点的左子节点。4.目标指的节点左子节点为null,右子节点不为null---返回目标节点的右子节点。

2023-04-29 20:53:11 49

原创 代码随想录算法训练营第二十一天

2、中序+双指针+定义两个count:使用count计算元素出现次数,使用maxCount 作为标志是否为众数。2、当root==null则返回null,当root==p或q时,则说明返回该节点,那么该父节点就包含p或q,如果父节点的左右子树都有p或q,那么该父节点就是公共祖先。如果只有一边有,则需要返回一边的信息,都没有则返回null。也使用了二叉搜索树特点,收集所有元素到map,然后用遍历map获取出现次数最多的元素再返回。1、因为需要把包含p或q的节点返回给父节点,需要用到后序遍历。

2023-04-26 01:31:04 46

原创 代码随想录算法训练营第二十天

1、前序递归构造:终止条件:数组长度为0则返回null,为1则返回其值的新节点单层逻辑:遍历到最大值,回去其值和索引位置,索引左边是左子树,右边是右子树。递归函数参数与返回值:使用力扣即可。

2023-04-25 01:55:26 58

原创 代码随想录算法训练营第十八天

1、递归+回溯:递归时减去节点值,到叶子节点时判定是否与目标值相等,相等则返回true,否则false。递归返回时需要把减去的值再加回来,因为查找右的路径时,父节点还原回未减值才行。2、递归时深度+1,返回递归时需-1。回溯到之前的值,以便遍历其他子树时深度是一直的。1、递归+回溯:使用depth、result分别记录深度和叶子节点值。2、层次迭代:遍历每一层保存第一个节点的值即可。3、最大深度的值就是最深最左值。

2023-04-23 02:54:29 66

原创 代码随想录算法训练营第十七天

1、后序递归:因为递归到叶子节点时无法确认是否是左叶子节点,因为需要在父节点时判定是否左子节点是否为叶子节点,因为在父节点收集结果。2、使用栈模拟遍历,然后使用队列求得最大高度,最后比较高度差,不符合返回false。遍历所有节点都符合就返回true。1、后序迭代获取最高深度,获取过程中发现左右子树差超过一则直接返回,否则继续比较。2、迭代同理---模拟递归过程。

2023-04-22 23:54:12 63

原创 代码随想录算法训练营第十六天

注:为啥没有左右深度不一致逻辑,其实已经隐藏在递归调用里了,如果左右子树深度不一致,那么必然右子树为0,左子树为1,中间节点为1+1;如果左节点为空,右节点不为空,则只返回右节点高度,反之返回左节点的。先处理中间节点,然后处理左右节点,但是返回时左右节点深度需要-1,是因为要返回到当前中间节点。遇到空节点时返回0,先处理左节点高度,再处理右节点高度,最后处理中间节点去左右节点的最大值,同时+1给自己这一层加。1、BSF:判定每层节点的左右节点是否都为空,如果是空则说明该节点时子节点,再返回累计的层数即可。

2023-04-21 02:27:25 136

原创 代码随想录算法训练营第十五天

队列收集:使用队列收集当层元素,添加到队列中,同时使用队列size,弹出当层元素数量。递归。

2023-04-20 03:27:00 59

原创 代码随想录算法训练营第十四天

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。栈迭代遍历:考虑入栈顺序,与处理出栈节点顺序。统一迭代:使用标记法,

2023-04-18 23:32:29 52

原创 代码随想录算法训练营第十三天

2、使用小顶堆特性,遍历map存入到小顶堆中,当超过出现频率次数数量时,则插入再弹出,维护满足频率次数数量的小顶堆,最后遍历小顶堆输出即可。push():判定队尾元素是否大于要插入的元素,如果是则抛弃,否则抛弃队尾元素直到遇到比插入值大的或者空队列,再插入队尾。1、使用单调队列保存最大值及后续较小值,当存入k个元素前,存入元素即可。3、后续存入元素时,先存入后弹出,再获取最大值,返回最大值数组即可。1、先把元素存入map进行统计计数,Map<元素,出现次数>2、存入到k个元素时,需要获取一次最大值。

2023-04-17 00:58:52 52

原创 代码随想录算法训练营第十一天

与上题同理,不过使用StringBuffer模拟栈,使用top作为指针即可,存入栈时存入对于指针的位置,弹出时同理。使用栈进行扣号匹配,遇到左边扣号时存入栈中,遇到右边扣号时弹出栈。如果弹栈元素对不上,则返回false。使用栈存储数值,遇到操作符时,弹出两个元素进行操作即可。

2023-04-16 02:10:42 47

原创 代码随想录算法训练营第十天

思路:使用两个栈,一个用于出栈,一个用于入栈。存入元素时,用入栈的存储,获取元素时,使把入栈的所有元素弹出存入出栈中,那么出栈的top就是队列头的元素。思路:使用一个队列,弹栈时除了最后一个元素全部出列再入列,操作完后第一个元素就是栈top元素了。

2023-04-16 02:04:32 51

原创 代码随想录算法训练营第九天

1、使用KMP算法找到前缀表,如果前缀表最后一位的相同前后缀>0,那么最小重复子串长度= 字符串长度-相同前后缀个数。如果字符串长度能整除最小重复子串长度,则说明该字符是由重复子串组成的,否则不是。2、为什么最小重复子串长度= 字符串长度-相同前后缀个数,如果字符串符合是由最小子串组成的话,满足该关系s(0~1) = s(2~3) = s(4~5)=s(字符串长度-相同前后缀个数)4、使用前缀表,将匹配串和原串进行匹配。1、KMP的算法核心分析匹配串是否有。2、KMP求next数组,即匹配串的。

2023-04-14 03:21:30 66

原创 代码随想录算法训练营第八天

2、使用头尾指针指向这次循环的头和尾,尾确认是需要循环k还是小于K情况,因此尾指针可以根据Math.min(chars.length - 1,i+k -1)得到。2、使用双指针,left指向就字符串最后一位,right指向新字符串的最后一位,因为从后面插入,满足在同一数组中替换,如果在同一字符组中从前面遍历插入,那么前面的字符会被刷掉。1、获得字符串s的字符数组,遍历循环,根据题目中大于等于2K则K反转,小于2K大于等于K则K反转,小于K则直接反转。3、反转去重多余空格的字符数组,再对单词反转即可。

2023-04-13 02:38:05 74

原创 代码随想录算法训练营第七天

3、遍历数组,left = i +1,right = lenght -1,循环left与right指针,当nums[i] + nums[left] + nums[right]>0时,把right--减少和,反正同理。4、对于i、left、right去重,对于i指针来说,去重为i > 0 && nums[i] == nums[i - 1]。1、使用26长度的int数组,遍历magazine的字符存入在数组中(字符-'a'为下标),如果存在+1,否则为0。2、遍历ransomNote,同理但存在则-1。

2023-04-12 02:33:49 65

原创 代码随想录算法训练营第六天

时间复杂度:O(N),其中 N 是数组中的元素数量。2、遍历数组过程中,当时元素 + map中的元素!2、那使用set判定求和过程中是否存在,如果存在则返回该数,再判定是否为1。1、使用map存储遍历过的元素(因为map是键值对形式,能存储元素和下标)4、遍历数组,如果每个索引的值都为0则为有效的字母异位词,否则不是。3、遍历数组2的元素在哈希表中是否为1,然后收集即可。空间复杂度:O(N),其中 N 是数组中的元素数量。1、使用包含所有字母的数组,初始化元素为0。

2023-04-11 02:19:34 63

原创 代码随想录算法训练营第四天

迭代:使用虚拟头结点,然后明确迭代退出条件,当奇数节点时,curr.next==null,当偶数节点时,curr.next.next ==null。使用三个指针pre、tail、temp分别保存curr.next、curr.next.next、curr.next.next.next。3、使用新的curr1指向虚拟头节点,然后循环上面次数,curr1.next就是要删除的节点,删除元素后返回虚拟头节点.next.时间复杂度:O(m+n),其中m,n分别为链表headA,headB的长度。

2023-04-09 02:09:57 95 1

原创 代码随想录算法训练营第三天

双指针:先对头节点值判定是否符合目标值,是则把头节点指向下个节点,然后使用双指针都指向新的头结点,循环快指针(当快指针为null则退出,循环条件:fast!=null),当快指针值是目标值时,则慢指针的下个节点指向快指针的下个节点,否则慢指针指向快指针节点上,同时快指针指向下个节点。递归其他解法:出口返回时用last接收返回,那返回时head则为前一个节点,那前节点.next.next即最后一个节点指向,同时前节点.next =null断开循环,不然递归返回到第一节点时,则与第二节点有形成循环。

2023-04-08 07:04:44 98 1

原创 代码随想录算法训练营第二天

2、209.长度最小的子数组使用滑动窗口时,找出起始点、终止点与窗口(刚开始没思路,只想到暴力解题),使用前缀法+二分查找需要了解二分查找找不到返回的是比目标值大一位的位置,还不够深刻。1、使用一个新数组记录前面元素之和,例如prefix[1] = 原数组的第一个元素之和,prefix[2] = 原数组的1、2元素之和,依次类推。思路一:数组数据是非递减,那么平方后,两个端点比较会得出一个最大值,那么将最大值放在新数组中,端点减一或加一,再次比较拿出新的最大值,直到两个端点重合(或者新数组填满)即可。

2023-04-05 21:45:41 114 1

原创 代码随想录算法训练营第一天

2.1、那么当target>mid时,则缩小左区间,同时left = mid +1,因为mid已经检查过了,可以跳过mid下标元素。2.2、那么当targetmid时,则缩小左区间,同时left = mid +1,因为mid已经检查过了,可以跳过mid下标元素。3.2、那么当target

2023-04-05 02:01:11 445 1

空空如也

空空如也

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

TA关注的人

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