自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随香录day31

以for循环去遍历孩子数组,index代表饼干数组最大尺寸的饼干,如果当前s[index] >=g[i]的话,那么饼干数组就继续往前走,并且孩子数组也在往前遍历。这里的思路就是用尺寸最大的蛋糕 优先满足胃口最大的孩子 为了避免尺寸浪费。所以这里分别对孩子数组和饼干数组进行排序,然后倒序遍历。思路:这道题啊 不太会。今天开始贪心算法了!

2023-07-30 12:56:14 291

原创 代码随想录day28

对path路径进行判断是否为空,如果不为空,那就同时判断上一次的元素也就是path[-1]是否大于我们当前的元素,如果上一个元素大于当前元素,或者当前元素已经在我们的used_set中了,那么久continue。当我们的收获到的path的长度已经和nums的长度一样了,说明我们完全遍历完了,也就是该收获的时候了,所以加入结果集然后return。和上一个题不一样的是,nums数组中出现了重复的元素,并且我们的输出结果中,也有重复的元素,但是要求返回不重复的排列。实际上在这一层他是已经使用过的。

2023-07-26 18:21:14 188

原创 代码随想录day28

循环终止条件:当index>nums的长度的时候,说明所有元素被遍历过了 就要退出了。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。中依旧讲解组合总和问题,本题集合元素会有重复,但要求解集不能包含重复的组合。思路:这道题和之前的回溯有相同的地方,不同点就在于元素是不重复的。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,有同学问了,什么时候for可以从0开始呢?求排列问题的时候,就要从0开始。

2023-07-25 15:43:24 170

原创 代码随想录day25

这道题的思路和我们之前做的一样,不过唯一不同的地方就是可以不在意答案元素内是否有重复的元素,之前我们的startindex是从i+1开始每次递归,那么这里既然元素可以取多次,那么我们的下次递归依旧是从i开始,就不是i+1了。我们转化为树形结构来看,有两个维度,一个是树的同一层,另一个是树的分支,也就是说树的分是可以取重复的,但是在树的同一层中,之前用过的就不能再用第二次了。思路:本题核心难度在于 数组内的元素可以重复,但是数组是不能重复的,比如[1,7]和[7,1]只能取一个。

2023-07-24 18:51:27 103

原创 代码随想录day25

如果当前的path已经达到了k的长度,但是不满足和等于n,那么就pop出来并且减掉当前的元素。单层循环逻辑:首先找到当前要遍历digits中字母的位置,也就是map[digits[index]],index从0开始,获取到了第一个数字 然后再map中找到了这个数字映射的字母。树的深度就是当前digits的长度,而最后的叶子节点就是我们要收集的结果,那么回溯出现在哪里呢?然后开始递归下一层,这里递归了之后是需要返回到上一层的,也就是s = s[:-1],这个就代表我们回溯到上一层的字母。

2023-07-22 19:58:00 145

原创 代码随想录day23

第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。单程循环逻辑:回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。回溯法是一种搜索的方式,常常与递归一起,如果某个程序写了递归,那么往往就缺少不了回溯。,是的,我指的是所有回溯法的问题都可以抽象为树形结构!可以看出这个棵树,一开始集合是 1,2,3,4,,[1,2],[2,1]这就是两种排列方式。

2023-07-21 14:24:52 26

原创 day23代码随香录

这是一个特例,当发现0不符合我们的范围区间的时候,不能直接return none,还要去考虑0的右子树,这里可以直接将0的右子树赋值给3的左子树,所以这就是涉及一个二叉树的重构过程。如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。都提到了,这是常用的操作手段。

2023-07-20 20:17:41 56

原创 代码随香录day21

本题目涉及到一个二叉搜索树树的插入操作,如果当root等于none的时候,实际上我们这里就要开始插入操作了,因为我们对二叉搜索树的特性有了解,如果这个val<根节点的话,它一定会被插到左子树中去,所以当root等于none的时候,也就是这个节点应该放的位置, 这 里直接return treenode(val)就可以了。如果pq两个节点都小于root,那么最近公共祖肯定是在他的左子树,如果都大于那么,肯定就在右子树。思路:这道题吧 面试如果考这个 我就直接g了。卡哥给的动画 直接秒懂!

2023-07-19 21:40:21 1030

原创 代码随想录day21

思路:这里再再再次强调!遍历二叉搜索树即为遍历有序数组!那么这个问题就转化成了 递增数组中找出 出现频率最多次数的元素!既然与元素出现次数相关 那就再用一个哈希表来记录即可!思路:记住二叉搜索树的特性,中序遍历是有序数组,所以我们直接对树做一次中序遍历,然后对数组中的node进行一次循环遍历不断获取最小值就行了,这里需要创建一个max_value拿来作比较。对于中序遍历这里就不多阐述了,奥这里我踩了好几次的坑,就是我们储存遍历的数组应该定义在主函数中,不然每次遍历都是空数组。(即,出现频率最高的元素)。

2023-07-18 17:36:14 224

原创 代码随想录day20

这里重复用了tree1去构造新的二叉树,所以最后直接返回tree1就好了,然后就是合并之后继续递归当前的节点的左子树和tree2当前节点的左子树(注意 他们是同步进行操作的,并不是异步)可能有朋友问 你怎么知道tree1遍历到当前节点的时候,tree2刚好也在这个位置呢?这里为什么要去判断index是不是大于0,经过刚才我的实验,我认为是如果我们的最大值在第一个元素也就是index= 0的时候,我们的左子树目前是不能构成的,那么就直接先构建右子树。同理,当前节点的右子树也是递归。

2023-07-17 14:12:41 128

原创 代码随想录day18

思路:其实这道题我看到的第一想法就是层序遍历去解决,然后直到查找到最后一层,直接返回左节点,但是这里有一个小坑,这里不单单是只左边节点,而指的是 最靠近左侧。这里要先定义一个depth,去记录当前的层次,max_depth去记录上一层次,如果depth>max_depth,那么我们就更新depth。这里我更喜欢去做减法,当经过一个node,就对应的减去当前节点的值,这里需要用到回溯,如果已经到了叶子节点,然后当前路径和并不满足target,那么就要返回上一层去访问其他子树,也就是要把当前减掉的值加回来。

2023-07-16 17:00:33 227

原创 代码随想录day17

这是左边的路径保存起来之后,这里就是当我们的左右孩子都为空的时候,说明当前这条路径就已经判断完了,然后就要回到上一个节点,去看他还有没有其他的路径可以继续走,如果还是没有,那么就继续返回上一个节点,直到有新的路径出现为止。那么对于这道题来说,既然是求高度,那么我们就选择后序遍历的方式,逐渐向上返回子树的高度。可以用-1来标识以当前节点为根节点的左右子树是否为平衡二叉树,如果在过程中有一棵子树的返回值是-1,那么整个树必然不是一个平衡二叉树,如果没有返回-1,那么就正常返回当前树的高度就可以了。

2023-07-14 17:53:04 199

原创 代码随香录day16

单层递归逻辑:分别向node的左子树和右子树进行递归,定义left和right接受返回值。不过这里会多几个判断条件,定义left&right去接受左子树和右子树的高度之后。单层递归:就是当前node的左孩子和右孩子。思路:这道题依旧是是用层序遍历的方式,不得不说层序遍历真的很好用!终止条件:当当前node为空时候。终止条件:当node为空时返回0。递归参数:root就足够了。思路:这道题推荐用层序遍历递归的方式。判断当前root的左右子树是否为空。这也是这道题的核心部分。

2023-07-13 16:29:43 210

原创 代码随想录day15

这里如果使用递归法会更好的理解,当我们储存每一层的答案数组的长度等于当前的level层数,说明我们这一层的节点都已经遍历完了,然后我们的下一次递归的level可以直接+1。思路:这道题可以用前序或者后序遍历的方式来做,中间插入一个交换左右节点的过程就可以了。递归参数:level代表当前是第几层次,levels代表每一层的节点集合,node也就是咱们的节点。单层循环罗杰:当我们交换完左右节点之后,就按照正常的前序或者后序的顺序来做。递归终止条件:当node为None的时候,说明没有元素了,那么直接终止。

2023-07-12 16:52:16 73

原创 代码随想录day14

在遍历左、右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树。若二叉树为空则结束返回,否则:(1)访问根结点。(2)前序遍历左子树。

2023-07-11 14:17:08 161

原创 昨日休息!今天是代码随香录day13

push:这个push函数是为了构建队列的顺序,也就是说当我每次push进一个新的元素,我就用这个元素和队列中的尾部元素进行判断,如果当前元素大于队列尾部,那么就把队列中的元素pop掉,直到当前这个元素<队列的尾部元素。pop:这个pop函数是为了检测,当我新加入的元素如果等于我队列中的头部元素,那么说明我当前窗口中的最大值已经被获取过了,我的窗口要往后移动了,那么就把当前这个头部元素pop掉。如果是大顶堆,那么最大的元素就在头部,那么当pop的时候,也就把最高频次的元素给丢掉了。

2023-07-10 20:12:46 99

原创 代码随想录day11

当我们判断当前元素如果是算法运算符号,我们就用一个result去记录栈中上两个数字的对应的算法操作符,比如当前是+,那么我们的result = stack[-1] + stack[-2].这里+和*都是按照这个顺序,但是当我们碰到-和/的时候,这里是用stack[-2] - stack[-1] 或者是stack[-2]/stack[-1].如果说当前元素不在栈中,那么我们就入栈,如果在栈中,我们需要同时判断当前元素是不是栈的最后一个元素,也就是我们上次加入的元素。

2023-07-08 17:04:43 137

原创 代码随想录day10

这里使用一个主进栈队列和一个 辅助队列进行后入先出操作。将入队的元素放入queue2中,然后queue1&2进行互换。这里有一个小细节,循环这里不包括最后一个元素,不然你直接交换就没什么区别了。思路:用两个list去模拟栈的操作,一个入栈list,一个出栈list. 并且了解栈的操作,pop,peek,push.

2023-07-07 17:03:35 228

原创 代码随想录day9

都要用到kmp算法了 还居然是简单难度!

2023-07-06 23:12:41 105

原创 代码随想录day8

注意一下 如果是两个连续的空格 那么是不能加入的,这里怎么判断是不是连续空格,就用我们上次添加的元素来看 if result[-1]==' ',如果不是,那么说明这个空格只出现了一次 就可以加入。如果是,那么这个就是连续的空格,我们不进行加入直接跳过。题目比较简单,这里用双指针的方法,注意下这里left

2023-07-05 19:38:17 215

原创 代码随想录day7

直到最后 记录ransomnote的哈希表的key值全部为0 .可以发现最后我是用的>0来判断的,如果说它大于0.说明第二个字符中的字母少了,也就是符合我们的题目 不能构成了。这道题和上面不同的是,我们不能通过一开始判断第一个元素>target就直接返回,因为上一道题目的target是一个定值,但是这道题中是一个任意值,我们可以通过后面元素相加而得到。其次,这里设置一个i,left,right. i是遍历元组内的元素,left是i+1,right是数组内的最后一个元素。其他地方 和上一道题目 基本都一样。

2023-07-04 19:04:16 104

原创 代码随想录day6

一开始的循环 去判断target - nums[i] 在不在循环中,如果当前元素不在,那么我们进行赋值,当前元素在hash表中就是{’2‘:0},这里例子和题目一样。已经满足了题目的要求 是两个数字的和,可以直接return hash表中的元素 和当前元素的下标 ,也就是return [hash.get(taget-nums[i]),i]这道题,需要用到数字取模和取余数的运算,建议掌握,其次,注意看题目,有可能出现无限循环,也就是说,当n重复出现在答案中,那么这个数字就不是快乐数。这道题还是比较简单的。

2023-07-03 21:34:14 89

原创 代码随想录再战day4

快指针走过的节点数是x+y+n(y+z) n代表快指针在里面走了几圈。这道题依靠自己写了绝大部分 但是最核心的交换两个链表 的步骤还是看了以前写的笔记。然后核心就是 我们要操作后面两个节点的时候 一定要移动到 这两个节点的上一个节点。解开之后x +y = n(y+z).既然是找环的入口 ,那肯定是出现在x上面,要求的就是x。然后会惊奇的发现 走了这么多步数以后当前的cur指针 刚好是倒数第n个节点的上一个节点。首先 是计算ab链表的长度,并且计算他们的差值。所以当n = 1的时候,x = z。

2023-07-01 21:57:16 261

原创 代码随想录再战day3

举个例子 [1,2,3]比如我们要删除的元素是2. 那么当我们指针指向1的时候,进行判断,如果当前元素指向的下一个元素是要删除的值,那么我们就改变这个元素的指向,变成指向下下个元素,也就是跳过了中间的元素2.这也就是我们的删除操作。然后创建我们的node。1->2->3->5,我要在5的前面插入一个4.那么我循环index到3的位置的时候就停下了,这时候创建节点4,首先让节点4指向5,其次再让当前的节点3指向4.所以这里需要一个temp_node来作为临时变量去存新元素。题目不难 但是很多细节问题。

2023-06-30 15:50:17 292

原创 代码随想录二战day2

977有序数组的平方。

2023-06-29 21:05:21 435

原创 再刷代码随想录day1

代码随想录 再次二战!

2023-06-28 17:47:43 24

原创 代码随想录 二刷继续 day2

继续努力

2023-02-01 14:59:12 53

原创 代码随想录二刷 day1

二刷 第一天开始

2023-01-17 23:22:23 62

原创 代码随想录算法训练营day42|Leetcode416(背包问题)

背包问题

2022-12-05 17:53:22 103

原创 代码随想录算法训练营day41|leetcode343

稍微有点难难

2022-12-01 22:38:38 526

原创 代码随想录算法训练营day39|leetcode62/63

第二个路径不太行 第一个题还可以 中等的动态规划几乎 不太会

2022-11-29 17:58:58 416

原创 代码随想录算法训练营day38|动态规划章节

动态规划开始入门了!!!!!

2022-11-28 23:15:19 149

原创 代码随想录算法训练营day37|Leetcode738/968/714

之前期末考试周 现在赶进度了

2022-11-26 21:16:20 85

原创 代码随想录算法训练营day36|leetcode435/763/56

今日一道题

2022-11-19 22:41:52 116

原创 代码随想录算法训练营day35|leetcode860/406/452

贪心 最近期末考试 之后慢慢补

2022-11-17 20:25:50 116

原创 代码随想录算法训练营day34|leetcode1004/134/135

贪心+1

2022-11-14 23:26:32 109

原创 代码随想录算法训练营day32|leetcode122/55/

贪心继续

2022-11-12 19:22:59 147

原创 代码随想录算法训练营day31|Leetcode455/376/53

新的起点!贪心算法开始 !昨天偷懒了 干不动哈哈哈

2022-11-11 16:34:24 127

原创 代码随想录算法训练营day29|Leetcode 46/47/491

回溯回溯

2022-11-09 21:23:49 57

原创 代码随想录算法训练营day28|Leetcode93/78/90

今日回溯算法

2022-11-08 20:20:42 810

空空如也

空空如也

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

TA关注的人

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