- 博客(56)
- 收藏
- 关注
原创 代码随想录算法训练营day31
本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。
2025-07-15 15:24:37
597
原创 代码随想录算法训练营day30
这道题目贪心的思路很简单也很直接,就是重复的一起射了,但本题我认为是有难度的。就算思路都想好了,模拟射气球的过程,很多同学真的要去模拟了,实时把气球从数组中移走,这么写的话就复杂了。而且寻找重复的气球,寻找重叠气球最小右边界,其实都有代码技巧。贪心题目有时候就是这样,看起来很简单,思路很直接,但是一写代码就感觉贼复杂无从下手。这里其实是需要代码功底的,那代码功底怎么练?多看多写多总结!这道题目leetcode标记为贪心算法,说实话,我没有感受到贪心,找不出局部最优推出全局最优的过程。
2025-07-13 17:58:49
925
原创 代码随想录算法训练营day29
对于本题首先给出了暴力解法,暴力解法模拟跑一圈的过程其实比较考验代码技巧的,要对while使用的很熟练。然后给出了两种贪心算法,对于第一种贪心方法,其实我认为就是一种直接从全局选取最优的模拟操作,思路还是很巧妙的,值得学习一下。对于第二种贪心方法,才真正体现出贪心的精髓,用局部最优可以推出全局最优,进而求得起始位置。这在leetcode上是一道困难的题目,其难点就在于贪心的策略,如果在考虑局部的时候想两边兼顾,就会顾此失彼。一次是从左到右遍历,只比较右边孩子评分比左边大的情况。
2025-07-13 17:44:36
885
原创 代码随想录算法训练营day28
股票问题其实是一个系列的,属于动态规划的范畴,因为目前在讲解贪心系列,所以股票问题会在之后的动态规划系列中详细讲解。可以看出有时候,贪心往往比动态规划更巧妙,更好用,所以别小看了贪心算法。本题中理解利润拆分是关键点!不要整块的去看,而是把整体利润拆为每天的利润。一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。大家可以看出思路想出来了,代码还是非常简单的。
2025-07-10 23:35:14
1021
原创 代码随想录算法训练营day27
本题的贪心思路其实并不好想,这也进一步验证了,别看贪心理论很直白,有时候看似是常识,但贪心的题目一点都不简单!后续将介绍的贪心题目都挺难的,所以贪心很有意思,别小看贪心!
2025-07-10 21:12:48
730
原创 代码随想录算法训练营day25
continue;continue;都是可以的,这也是很多同学做这道题目困惑的地方,知道也行而也行,但是就想不明白为啥。所以我通过举[1,1,1]的例子,把这两个去重的逻辑分别抽象成树形结构,大家可以一目了然:为什么两种写法都可以以及哪一种效率更高!这里可能大家又有疑惑,既然也行而也行,那为什么还要写这个条件呢?直接这样写 不就完事了?continue;其实并不行,一定要加上或者。
2025-07-05 21:04:20
927
原创 代码随想录算法训练营day24
相信大家经过了组合问题:77.组合(opens new window)回溯算法:组合问题再剪剪枝(opens new window)216.组合总和III(opens new window)17.电话号码的字母组合(opens new window)39.组合总和(opens new window)40.组合总和II(opens new window)分割问题:131.分割回文串(opens new window)93.复原IP地址(opens new window)
2025-07-04 22:10:43
905
原创 代码随想录算法训练营day23
本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。本题搜索的过程抽象成树形结构如下: 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回这里依然是定义两个全局变量,二维数组result存放结果集,数组path存放符合条件的结果。(这两个变量可以作为函数参数传入)首先是题目中给出的参数,集合candidates, 和目标值target。此外我还定义了int型的sum变量来统计单一结果path里的
2025-07-04 21:37:51
936
原创 代码随想录算法训练营day22
开篇就介绍了本题与77.组合 (opens new window)的区别,相对来说加了元素总和的限制,如果做完77.组合 (opens new window)再做本题在合适不过。分析完区别,依然把问题抽象为树形结构,按照回溯三部曲进行讲解,最后给出剪枝的优化。相信做完本题,大家对组合问题应该有初步了解了。
2025-07-02 23:54:10
955
原创 代码随想录算法训练营day21
在二叉树:构造二叉树登场!和二叉树:构造一棵最大的二叉树 (opens new window)之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树。其实思路也是一样的,不断中间分割,然后递归处理左区间,右区间,也可以说是分治。此时相信大家应该对通过递归函数的返回值来增删二叉树很熟悉了,这也是常规操作。在定义区间的过程中我们又一次强调了循环不变量的重要性。最后依然给出迭代的方法,其实就是模拟取中间元素,然后不断分割去构造二叉树的过程。
2025-07-01 20:46:37
1071
原创 代码随想录算法训练营day20
对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共祖先问题 (opens new window)简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。235. 二叉搜索树的最近公共祖先相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。代码随想录。
2025-06-30 23:31:06
897
原创 代码随想录算法训练营day18
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:提示:树中至少有 2 个节点。递归那么二叉搜索树采用中序遍历,其实就是一个有序数组。最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。需要领悟一下二叉树遍历上双指针操作,优先掌握递归给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。例如:给定 BST [1,null,2,2],返回[2].
2025-06-28 22:08:10
822
原创 代码随想录算法训练营day17
654.最大二叉树654.最大二叉树给定一个不含重复元素的整数数组。通过给定的数组构建最大二叉树,并且输出这个树的根节点。示例 :提示:给定的数组的大小在 [1, 1000] 之间。最大二叉树的构建过程如下:构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。
2025-06-28 00:53:31
656
原创 代码随想录算法训练营day14
3.确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。注意上面最后一种情况,我没有使用else,而是else if, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。
2025-06-26 23:35:22
1003
原创 代码随想录算法训练营day15
257. 二叉树的所有路径110.平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7]返回 true。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4]返回 false。此时大家应该明白了既然要求比较高度,必然是要后序遍历。递归三步曲分析:1.明确递归函数的参数和返回值参数:当前传入节点。
2025-06-25 23:24:06
681
原创 代码随想录算法训练营day13
刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。int val;大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。要注意二叉树节点定义的书写方式。
2025-06-24 20:16:16
676
原创 代码随想录算法训练营day11
347.前 K 个高频元素150. 逆波兰表达式求值根据 逆波兰表示法,求表达式的值。有效的运算符包括 + , - , * , /。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 3:输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]输出: 22。
2025-06-21 23:51:18
788
原创 代码随想录算法训练营day10
栈与队列栈先进后出栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。不像是set 或者map 提供迭代器iterator来遍历所有元素。栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器,理论基础了解一下 栈与队列的内部实现机制,文中是以C++为例讲解的。
2025-06-20 22:24:21
701
原创 代码随想录算法训练营day9
因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃。
2025-06-19 23:38:08
924
原创 代码随想录算法训练营day8
541. 反转字符串II344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]示例 2:输入:["H","a","n","n","a","h"]
2025-06-18 23:34:19
1053
原创 代码随想录算法训练营day4
19.删除链表的倒数第N个节点24. 两两交换链表中的节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。使用虚拟头结点,接下来交换相邻两个元素,24. 两两交换链表中的节点用虚拟头结点,这样会方便很多。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。
2025-06-14 22:50:58
1096
原创 代码随想录算法训练营day3
/ 结点的值int val;// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)链表的操作。
2025-06-13 23:46:46
969
原创 代码随想录算法训练营day2
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。暴力解法 两个for循环 不断的寻找符合条件的子序列,时间复杂度O(n^2)循环的索引表示 滑动窗口的209.长度最小的子数组题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。拓展题目可以先不做。
2025-06-12 23:22:20
1079
原创 代码随想录算法训练营day1
数组是存放在上的的集合通过获取下标对应的数据数组下标都是的 数组的二维数组行第一索引 列第二索引如a[0][1]=1 a[2][3]=3c++中二维数组在地址空间上是连续的 Java中不连续。
2025-06-11 23:24:52
811
原创 代码随想录算法训练营day34
343.整数拆分 (可跳过)62.不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?解释: 从左上角开始,总共有 3 条路径可以到达右下角。注意题目中说机器人每次只能向下或者向右移动一步,那么其实。
2024-08-22 05:26:16
1182
原创 代码随想录算法训练营day32
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
2024-08-21 17:12:33
909
原创 代码随想录算法训练营day31
例:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。
2024-08-21 16:11:31
460
原创 代码随想录算法训练营day30
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。但仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。如果真实的模拟射气球的过程,应该射一个,气球数组就remove一个元素,这样最直观,毕竟气球被射了。给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
2024-08-21 15:47:49
724
原创 代码随想录算法训练营day29
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1。你从其中的一个加油站出发,开始时油箱为空。
2024-08-19 23:43:44
1057
原创 代码随想录算法训练营day28
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0])你的目标是使用最少的跳跃次数到达数组的最后一个位置。判断你是否能够到达最后一个位置。
2024-08-15 00:03:40
971
原创 代码随想录算法训练营 Day27
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。
2024-08-13 20:56:21
1108
原创 代码随想录算法训练营 Day25
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了,给定一个 没有重复 数字的序列,返回其所有可能的全排列。用for循环暴力把结果搜索出来,全排列。332.重新安排行程(可跳过)332.重新安排行程(可跳过)51.N皇后(适当跳过)37.解数独(适当跳过)
2024-08-12 21:53:05
294
原创 代码随想录算法训练营 Day24
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]子集是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。
2024-08-11 23:33:14
268
原创 代码随想录算法训练营 Day23
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。本题没有组合数量要求,仅仅是总和的限制,递归没有层数的限制,只要选取的元素总和超过target就返回。candidates 中的每个数字在每个组合中只能使用一次。candidates 中的数字可以无限制重复被选取。
2024-08-09 22:46:08
261
原创 代码随想录算法训练营 Day22
回溯法也可以叫做回溯搜索法,它是一种搜索的方式,回溯是递归的副产品,只要有递归就会有回溯,回溯函数也就是递归函数,指的都是一个函数。
2024-08-08 20:00:35
563
原创 代码随想录算法训练营 Day21
的时候直接return NULL。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。分割点就是数组中间位置的节点。669. 修剪二叉搜索树。669. 修剪二叉搜索树。
2024-08-07 22:57:50
228
原创 代码随想录算法训练营 Day20
因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。遍历二叉搜索树,找到空节点,插入元素。235. 二叉搜索树的最近公共祖先。235. 二叉搜索树的最近公共祖先。701.二叉搜索树中的插入操作。450.删除二叉搜索树中的节点。
2024-08-06 04:03:16
383
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅