- 博客(24)
- 收藏
- 关注
原创 代码随想录算法刷题训练营第二十三天 | 455. 分发饼干 376. 摆动序列 53. 最大子数组和
最开始时,遇到平地时,遇到平地时这个条件不符合,prediff从何而来,除了最开始的0,后面都是curdiff造的,只有在遇到坡度变化时才赋值给prediff。思路:求最大子数组和,用贪心思想,我让每新加一个数的子数组都最大,如果此时和《0,就舍弃 了,因为负数只会让和变小。记录前一对差值,后一对差值,如果前一对小于0,后一对》0,或者前一对大于0,后一对《0,就说明遇到极值,就+1。思路: 摆动序列就是一个山峰一个山谷,一个山峰一个山谷,可以删除元素。题目链接:。题目链接:。
2024-09-02 16:22:28
314
原创 代码随想录算法刷题训练营第二十二天 | 491.递增子序列 46.全排列 47.全排列 II 332.重新安排行程(可跳过 51.N皇后(适当跳过) 37.解数独(适当跳过)
思路:还是先排序,一层之中用过的不能再用了,:把点看作分割的位置,套用回溯模板。每个元素有选或不选两个选择。题目链接:。2. 收集每个结果集。
2024-09-02 15:48:15
296
原创 代码随想录算法刷题训练营第二十一天 | 93.复原IP地址 78.子集 90.子集II
思路:还是先排序,一层之中用过的不能再用了,题目链接:。:把点看作分割的位置,套用回溯模板。每个元素有选或不选两个选择。题目链接:。2. 收集每个结果集。
2024-08-25 22:00:00
216
原创 代码随想录算法刷题训练营第二十天 | 39. 组合总和 40.组合总和II 131.分割回文串
这里暂时理解为,进入下一层之前设置为true,表示未使用,因为下一层是新开始,回到这一层,设为false,表示这个元素在这一层使用过了,for循环往后加上判断如果前一个是false就跳到下一个。一层为每一个集合内的元素,向下为当前元素及以后的元素,所以传入的start为当前的i,这样下一层无法使用前一个元素,避免重复。就是同一层,同一个for循环内使用过,比如1,1,3 target:4。思路: 集合内有重复元素,结果不能重复,也就是使用过的元素不能再使用。题目链接:。
2024-08-25 07:00:00
223
原创 代码随想录算法刷题训练营第十九天 | 77. 组合 216.组合总和III 17.电话号码的字母组合
每个递归取出集合中的一个元素,比如第一个递归取2,第二个取3第三个取4;向下递归就是调用函数自身,for遍历集合元素。这个有点繁琐,把每个按键放入数组。:套用模板。题目链接:。17.电话号码的字母组合。题目链接:。1-n中k个数的组合。216.组合总和III。
2024-08-23 22:36:13
352
原创 代码随想录算法刷题训练营第十八天 | 669. 修剪二叉搜索树 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
思路:变成的是高度二叉搜索树,如果只变成二叉搜索树就太简单了,直接一条龙就可以,高度就是平衡二叉树,左右子树高度差不超过1。单层逻辑:先确保结点在范围内,用二叉搜索树的性质,不在范围内就搜某个子树,然后把当前结点和孩子接入。所以把二叉搜索树想象成一个有序数组,从后往前累加,搞一个pre,有点像前缀和。:给两个限制值,一个最大一个最小;终止条件:为空就返回null。
2024-08-23 07:00:00
250
原创 代码随想录算法刷题训练营第十七天 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
二叉搜索树的最近公共祖先,从上到下遍历第一个val<= >=p,q的就是他们的公共祖先;思路:也是二叉搜索树的性质,观察发现不管要插入多大的值,都可以在null处插,因为结点左子树上都小于他,右子树上都大于他;235. 二叉搜索树的最近公共祖先。450.删除二叉搜索树中的节点。701.二叉搜索树中的插入操作。递归的终止条件:如果为空就返回。从上到下遍历,前序遍历。题目链接:。
2024-08-21 07:00:00
300
原创 代码随想录算法刷题训练营第十六天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
我们想从底向上找公共祖先,用后序遍历即可实现,返回值可以为布尔表示是否找到公共祖先,题目中需要结点,所以返回结点,如果为p,q就返回,如果看到返回不为空就是找到p,q。:也是利用二叉搜索树都性质,把他当成一个有序数组来看,就是求相邻两个元素的差,取最小那个;pre是上一个结点,需要记录当前count频率,最大频率maxCount,结果集,如果更新最大频率,就清空结果集。如果pre为空,就是第一次,加个判断不管他。图1:如果左孩子和右孩子返回都不为空,就返回root;题目链接:。
2024-08-19 23:00:00
727
原创 代码随想录算法刷题训练营第十五天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
思路:肯定要用到二叉树搜索树都性质,所有左子树都小于根节点,右子树大于结点。:在数组中找最大的值作为根节点,左右子树照着递归。题目链接:。题目链接:。也可以用迭代法,用栈实现中序遍历。思路:弄到两个二叉树的并集。题目链接:。
2024-08-19 07:00:00
336
原创 代码随想录算法刷题训练营第十四天 | 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树
可以用层序遍历,遍历每一层时,保存第一个结点,最后就是最左结点啦.如何保存第一个呢。递归: 这里递归函数的含义是看该节点下所有路径是否满足。思路:要看所有从根节点到叶结点的路径值和是否为目标值。开辟数组浪费时间,所以用下标来表示。:最深一层的最左侧的那个结点。题目链接:。
2024-08-17 22:57:03
466
原创 代码随想录算法刷题训练营第十三天 | 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数
对称二叉树是关于中线轴对称,左子树的左孩子和右子树的右孩子相等可以用递归法:终止条件是左右结点同时为空(true)或者有一个为空(false),或者值不等(false)单层递归逻辑是: 内侧相等,外侧相等;要让对应的孩子都能比较一下转化为迭代法:处理出队的前两个,让前两个是要比较的那两个。
2024-08-16 23:19:49
198
原创 代码随想录算法刷题训练营第十二天 | 101. 对称二叉树 226. 翻转二叉树 104.二叉树最大深度 111.二叉树最小深度
对称二叉树是关于中线轴对称,左子树的左孩子和右子树的右孩子相等终止条件是左右结点同时为空(true)或者有一个为空(false),或者值不等(false)单层递归逻辑是: 内侧相等,外侧相等;要让对应的孩子都能比较一下转化为迭代法:处理出队的前两个,让前两个是要比较的那两个。
2024-08-16 07:00:00
271
原创 代码随想录算法刷题训练营第十一天 | <1>递归遍历(必须掌握) <2>迭代遍历 <3> 统一迭代 <4>层序遍历
前序,中序,后序遍历:递归调用函数本身,这是前序遍历代码,中序后序只需要调整list.add()的位置即可.
2024-06-26 00:14:31
629
原创 代码随想录算法刷题训练营第十天 | 150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素
150. 逆波兰表达式求值:栈的应用,逆波兰表达式是把操作符放到两个操作数的后面解的时候用栈把数压入栈,遇到操作符就取头两个元素进行计算并压栈.
2024-06-21 15:50:40
247
原创 代码随想录算法刷题训练营第九天 | 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
用栈实现队列的入队,出队,判空,取队头元素因为栈是后进先出,队列是先进先出,要实现队列要让入栈的元素到栈顶去两个栈,一个负责in,一个out入队时,栈in里面直接push出队时,栈out里面是栈in里面pop过来的,是颠倒的. 如果栈out里面还有元素,就不能再从栈in里面pop过来;
2024-06-19 15:59:13
377
原创 代码随想录算法刷题训练营第八天 | 151.翻转字符串里的单词 ● 卡码网:55.右旋转字符串 ● 28. 实现 strStr() 459.重复的子字符串
最后返回时,如果刚好k==size&&k-1位置不为空格,就返回0-k;否则就是移位完的长度小于原来的,k后面还有字符,正常情况0-k-1.遍历时跳过空格,用临时变量记录单词第一个字符下标,,然后反转,之后用k++来定位,当到单词最后一个字符时要添加空格,要加边界防止越界。字符数组由字符串.toCharArray()变来,然后遍历字符数组,当然要有一个idx做移位的下标。把字符串看成后k的一段,和前面一段,我最开始想的是把后k个和前k个换位,但是这样就将第一部分打散了。//todo 暂时跳过。
2024-06-16 22:54:48
263
原创 代码随想录算法刷题训练营第七天 | 344.反转字符串 ● 541. 反转字符串II ● 卡码网:54.替换数字
Java可以新建一个字符数组 (长度通过记算数字数目) ,用str.arraycopy操作,将源字符串放到新字符数组里面,可以规定原数组开始下标,复制到新数组下标的位置,复制长度.左一个 l ,右一个 r ,让他们同时向中间靠近,while(l
2024-06-13 19:24:59
280
原创 代码随想录算法刷题训练营第六天 | 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和
四个数组,分别取一个元素合为零即可,只需要记录有几组.如果4个for会很高的复杂度,如果让第一个成为哈希表,3个for,复杂度也太高,两个两个进行操作,使复杂度降到On^2,先穷举前两个数组,放入哈希表,然后再遍历后两个,如果哈西表里面有就count加上他的value.思路:判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成字母用数组实现哈希表,用string.toCharArray(),第一个字符串里面字符对应--,第二个++,最后有小于零则false。
2024-06-13 09:05:35
438
原创 代码随想录算法刷题训练营第五天 | 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和
读题,只要所含字母相同,他们的个数也相同即可需要一个哈希表(散列表),用26个下标代表字母,然后遍历记录每个字母的数目,然后遍历另一个进行字母数字减的操作,最后有不为零,则不满足.java语法:视频讲解:思路:就是要两个数组中都有点数,可以选用set表实现hashset.把第一个数组存入set,然后对第二个进行遍历,如果set里面有则说明公有,放到另一个set中,避免放入不知道大小的数组中浪费内存,最后可以将set转为数组,也可另new数组返回。
2024-06-11 21:19:12
510
原创 代码随想录算法刷题训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
思路:交换两两的结点,首先要想清楚有几个过程,过程中,如果是第一对就要特殊处理,所以以后都用虚拟节点dummyNode3中需要用到下一对结点的第一个结点,所以需要暂存他到temp中循环时需要有两个指针做暂存,暂存这对结点的第一个结点,下一对结点的第一个结点思路:删除倒数第n个结点,想到维护一个结点,让他一直是倒数第n个结点,一直到扩展到最后一个结点其实是双指针,一个指针快,一个慢,快指针找到第n个结点,然后快慢指针同时向后移动,慢指针即为要删除的结点.
2024-06-10 21:09:54
393
原创 代码随想录算法刷题训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
移除单链表中的目标元素.首先想到如何移除,该移除的结点的前一个结点直接指向改移除的元素的后一个结点即可,但是如果移除第一个结点,而他没有前一个结点,此时考虑要么单独处理,要么加一个虚拟节点即可。首先想反转链表,就把后一个的指针指向前一个结点,但是还要能找到后一个结点,这就需要一个东西来暂存这后一个结点,还得要一个前一个结点,让当前结点指向前一个结点.反转指向之后,前一个结点要变成当前结点,当前结点要等于后一个结点(暂存的),最终返回当前结点,也就是pre.思路:开辟新链表浪费空间,直接进行迭代反转链表.
2024-06-08 21:27:32
268
原创 代码随想录算法刷题训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
思路:首先看到是有序数组,又看到有负数(负数平方后会变大),数组两头平方的值肯定是最大的,想到把他们比较放到,放到新数组中.具体的,用两个指针分别指向两头,将所指的数平方后比较,大的先放进入新数组,指针向中间靠拢. 当两个指针相等时,此时的值并未添加进入新数组,所以while(l<=r)为循环条件.要定义一个不变的规则,一圈里面有1->2,3->4,5->6,7->8,这四个固定方向,所以就以前闭后开为规则,一圈一圈的填充数组.思路:暴力做法是遍历所有段,他段的开头结尾都是遍历数组,复杂度为O(n^2).
2024-06-07 11:22:03
453
原创 代码随想录算法刷题训练营第一天 | 704.二分查找 35.搜索插入位置 27.移除元素
思路:比二分查找多了一个找不到的情况下应该插入的位置,就查找到最后的结果分析,当目标元素小于nums[0]时,最后l为0,r为-1. 其他情况下都是l最后变成mid+1,应该插入的位置,所以最后返回l即可;题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。思路:在一个范围内找target,保持这个范围的开合状态不变,每次取中间元素和target比较,如果大于target就取左区间,如果小于就取右区间.开合状态如果左闭右开,用 while(l<r) , l==r 时有错误(不存在);
2024-06-06 01:00:02
318
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人