- 博客(34)
- 收藏
- 关注
原创 Day 38 动态规划 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,,贪心没有状态推导,而是从局部直接选最优的。746. 使用最小花费爬楼梯。509. 斐波那契数。
2024-04-01 17:26:22
191
原创 Day35 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
● 452. 用最少数量的箭引爆气球。● 406.根据身高重建队列。● 860.柠檬水找零。
2024-03-27 18:36:27
143
原创 DAY 34 ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果
● 1005.K次取反后最大化的数组和。● 135. 分发糖果。● 134. 加油站。
2024-03-26 21:04:11
103
原创 【无标题】
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。
2024-03-25 21:31:35
260
原创 Day 28 93.复原IP地址 78.子集 90.子集II
中包含了4个段(即IP地址的4个部分)。如果这两个条件都满足,那么就将当前的路径作为一个合法的IP地址添加到结果列表。(是否已经处理完整个字符串。2.在取到第四位时做剪枝。要去重就要先对集合排序。
2024-03-19 20:35:10
218
原创 Day 27 39. 组合总和 40.组合总和II 131.分割回文串
递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。要去重记得要对数组排序。
2024-03-18 20:32:05
136
原创 Day22 216. 组合总和 III 17.电话号码的字母组合
本题和区别之一就是集合固定的就是9个数[1,...,9],所以for循环固定i<=9。
2024-03-18 16:02:52
233
原创 Day23 今天做了三个题 ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树
如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。深度为k,有2^k-1个节点的二叉树。:除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。(完全二叉树底层必须是从左到右连续的,且次底层是满的。
2024-03-14 20:24:20
760
原创 第22天 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
二叉搜索树是有序的,因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。只要遍历二叉搜索树,找到空节点 插入元素就可以。701.二叉搜索树中的插入操作。235. 二叉搜索树的最近公共祖先。450.删除二叉搜索树中的节点。二叉搜索树中删除节点遇到的情况。
2024-03-13 20:57:05
222
1
原创 ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。想到二叉搜索树就能想到中序遍历,因为中序遍历的数组是有序的。给你一个含重复值的二叉搜索树(BST)的根节点。
2024-03-12 20:44:00
135
1
原创 第20天 654. 最大二叉树 617. 合并二叉树 700. 二叉搜索树中的搜索 98. 验证二叉搜索树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的。返回以该节点为根的子树。null 的节点将直接作为新二叉树的节点。,判断其是否是一个有效的二叉搜索树。合并过程必须从两个树的根节点开始。给定二叉搜索树(BST)的根节点。给你一个二叉树的根节点。返回合并后的二叉树。
2024-03-11 20:43:43
184
1
原创 day17 513. 找树左下角的值 112. 路径总和 113. 路径总和 II 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树
513. 找树左下角的值题目:给定一个二叉树的root,请找出该二叉树的节点的值。假设二叉树中至少有一个节点。112. 路径总和给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则,返回false。是指没有子节点的节点。题目:给你二叉树的根节点root和一个整数目标和targetSum,找出所有路径总和等于给定目标和的路径。是指没有子节点的节点。
2024-03-09 18:40:39
426
原创 第十七天 110. 平衡二叉树 257. 二叉树的所有路径 404. 左叶子之和
因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)是指该树所有节点的左右子树的深度相差不超过 1。题目:给定一个二叉树,判断它是否是 平衡二叉树 (,返回所有从根节点到叶子节点的路径。本题会用到前序遍历和回溯。给你一个二叉树的根节点。是指没有子节点的节点。,返回所有左叶子之和。
2024-03-08 21:36:37
136
1
原创 day 16 ● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔。是指从根节点到最远叶子节点的最长路径上的节点数。给定一个 N 叉树,找到其最大深度。给定一个二叉树,找出其最小深度。叶子节点是指没有子节点的节点。104.二叉树的最大深度。,求出该树的节点个数。
2024-03-07 21:08:40
212
1
原创 day15 二叉树的层序遍历 226.翻转二叉树 101. 对称二叉树 (优先掌握递归)
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,十个题的思路都有相似的地方。二叉树的层序遍历,,需要借助队列来实现(此时又发现队列的一个应用了)。
2024-03-06 21:51:15
693
1
原创 了解二叉树
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。确定每一层递归需要处理的信息。了解这些就不难理解二叉树的前序中序和后序的递归遍历了。
2024-03-05 20:49:35
192
原创 第十三天 239. 滑动窗口最大值 347. 前 K 个高频元素
然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口每次只向右移动一位。那么这个维护元素单调递减的队列就叫做。总结:能看懂但是写不出来,有点费劲。,请你返回其中出现频率前。239. 滑动窗口最大值。题目:给你一个整数数组。
2024-03-04 21:15:30
211
1
原创 第十一天 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。今日用时:两个半小时 能把大体框架写出来一些,但是不完整,继续加油。在完成所有重复项删除操作后返回最终的字符串。思路:要记得是把字符串变为列表,最后要拼接回去。当最后字符串匹配完,栈为空,则全部匹配完成。
2024-03-02 16:30:19
280
1
原创 第十天 栈 232. 用栈实现队列
题目:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(请你仅使用两个栈实现先入先出队列。思路:栈的实现,关于pop()和peek(),个人感觉第二个比较好理解。,再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。push(x) -- 将一个元素放入队列的尾部。在push数据的时候,只要数据放进输入栈就好,peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。pop() -- 从队列首部移除元素。代码:用一个队列实现。
2024-03-01 20:55:20
197
原创 kmp算法
总结:回顾一下前几天做的代码题,有些有思路但是还是不太能直接上手,总体还是有提升。思路:我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。字符串的第一个匹配项的下标(下标从 0 开始)。思路:暴力枚举比较简单,kmp算法来做就有点困难了。,检查是否可以通过由它的一个子串重复多次构成。为什么要使用前缀表?能够找到最长相等前后缀。kmp算法主要用来解决字符串匹配问题。题目:给定一个非空的字符串。
2024-02-29 21:08:03
264
原创 day 8 |344. 反转字符串 541. 反转字符串 II 54. 替换数字 151. 反转字符串中的单词 55. 右旋字符串
题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。return "".join(t)的意思是列表t中存储了经过处理后的字符串s,将列表t中的元素连接成一个字符串并返回。从0到n,步长为2*k,反转i到i+k,连接起来形成新的字符串。
2024-02-28 20:44:37
1613
原创 day 7|| 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上,找到 a = nums[i],b = nums[left],c = nums[right],如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些,相反left也是一样,向右移动。题目:给你四个整数数组。题目:给你一个整数数组。
2024-02-27 21:32:25
246
原创 day 6 || 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1.两数相加
思路:初始化两个计算长度的数组,提示给出题中两个数组的在0到一千,所以初始化长度为1001,创建一个空列表用于储存数据,遍历两个数组并把两个数组中的元素暂时储存到开始两个计算长度的数组中,设定一个变量k,若两个数组中都有k则把k添加到空列表中。思路:如果字符串的长度不等,肯定不是字母异位词。初始化一个字典,使其所有的key值都为0,统计字符串中的字符数量,有就加,然后继续遍历下一个字符串,有就减,最后遍历差值,如果字符数量一致则为字母异位词(重排)。整数,并返回它们的数组下标。,请你在该数组中找出。
2024-02-26 21:12:09
334
1
原创 第四天 ||24. 两两交换链表中的节点 19.删除链表的倒数第N个节点
思路:设置快指针每次走两个节点,慢指针每次走一个节点,所以快指针是慢指针的两倍,slow=x+y fast=x+y+n(y+z) 能写出这些公式:2(x+y)=x+y+n(y+z) 化简得出x的相关式子为x=(n-1)(y+z)+z 可以看出x=z 当两个指针相遇,此时慢指针从头指针开始 与快指针一起运动,直到在环形链表入口再次相遇。2.双指针法,运用快慢指针,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。
2024-02-25 20:37:07
282
原创 第三天 | 203 移除链表元素 704.设计链表 206.反转链表
将dummy结点的next指针指向的节点赋值给new_Node,相当于将原来链表中的头结点储存在new_Node中,然后创建一个ListNode对象,值为val,将新结点的next指向new_Node,原来dummy结点的next指针指向这个节点。这题的思路可以设置一个虚拟头结点,使它的链表下一个元素是原链表的头结点,遍历链表并删除值为val的结点,最后记得返回虚拟链表的下一个元素,才能是原来链表移除后的新链表。,表示已经处理完整个链表,可以返回反转后的链表头节点。,请你反转链表,并返回反转后的链表。
2024-02-23 18:50:16
231
原创 代码随想录第二日 | 977.有关数组的平方
然后是双指针法,这个开始确实没想到,先定义左右两个指针,再定义一个新数组,使k指向结果并插入到新数组中,k要从后往前得值,所以k=len(nums)-1。排序,所以数组左右两端的数平方后一定是最大的,比较后赋给k,然后left+=1或者right-=1,这种方式就不需要再次排序,最后左右指针停止,还有一个较小的数值未取到,指针k要再往前进一个。思路:保证循环不变量,核心关键点在于loop变量和偏移量的设计,保证好每次循环的节点都是从头到尾部前一位,注意好填充方向,处理好边界条件,还是要多练熟能生巧。
2024-02-22 23:17:51
276
原创 代码随想录训练营第一日 704二分查找,27移除元素
开始没用二分查找做出来了,通过文章,视频成功写出代码,二分查找两种做法和自己乱写的,移除元素的快慢指针和暴力法都做出来了,除了暴力有一丝不理解其他都能完成。时间复杂度O(logn)时间复杂度为O(n)今日用时:两个半小时。
2024-02-21 13:41:13
303
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人