- 博客(31)
- 收藏
- 关注
原创 代码随想录算法训练营第三十六天| LeetCode435. 无重叠区间、LeetCode763.划分字母区间、LeetCode56. 合并区间
方法有根据左边界或者右边界两种情况。这里以左边界为例:每次比较的内容是第i 个区间的左边界与第i - 1 个区间的右边界。如果第1 个区间的左边界大于第0 个区间的右边界,则代表两个区间并没有重合,那么pre 则用第1 个区间的右边界标记,之后则用pre 与下一个区间的左边界比较。如果第i 个区间的左边界小于第i - 1 个区间的右边界,则代表区间有重合,那么count 计算重合区间的数字则会自加,这时pre 是等于重合的两个区间中小的右区间,这个过程体现了贪心算法,因为希望删除右边更长的区间来减少影响。
2024-08-27 06:53:57
90
原创 代码随想录算法训练营第三十四天| LeetCode860.柠檬水找零、LeetCode406.根据身高重建队列、LeetCode452. 用最少数量的箭引爆气球
如果收到的是5 或者10 的纸币,那么找零的选择是固定的,并不需要考虑贪心策略。所以贪心策略应用于收到20 的纸币时,这个时候的局部最优是先用10 和5 的纸币找零,因为5 可以用于给10 找零,所以全剧最优是可以对所有的柠檬水找零。
2024-06-03 23:33:31
376
原创 代码随想录算法训练营第三十三天| LeetCode1005.K次取反后最大化的数组和、LeetCode134. 加油站、LeetCode135. 分发糖果
这个题目中用到了两次局部最优,第一次是在先用k 将数组中绝对值大的负数转换为正数,这样保证了局部最优。之后又使用k 剩余的次数用在绝对值最小的数值上,这是第二次局部最优。为了提高代码的运行效率,使用k % 2 是否存在余数来快速判断,是否需要给绝对值最小的数目 * (-1) 来消耗掉k 的数值。这里还用到了流式操作来实现对整数数组 nums 的绝对值大小排序,IntStream.of(array) 先将给定的整数数组转换为一个 IntStream 对象。
2024-06-01 01:12:48
862
原创 代码随想录算法训练营第三十二天| LeetCode122.买卖股票的最佳时机II、LeetCode55. 跳跃游戏、LeetCode45.跳跃游戏II
局部最优的区间是第二天价格比第一天价格高的情况,全局最优的区间是将所有的正收入天数累加。
2024-05-26 06:55:39
274
原创 代码随想录算法训练营第三十一天| 贪心算法理论基础、LeetCode455.分发饼干、LeetCode376. 摆动序列 、LeetCode53. 最大子序和
贪心算法理论基础:贪心算法没有类似递归、回溯的套路。主要的思想可以理解为:用局部最优找全局最优。
2024-05-25 04:36:23
360
原创 代码随想录算法训练营第三十天| 回溯方法总结、LeetCode332.重新安排行程、LeetCode51. N皇后、LeetCode37. 解数独、总结
终止条件:ticketNum 的数目。对于比较器不太熟悉.. 后期补这个题目吧。
2024-05-22 04:39:07
163
原创 代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II
首先,本题不能考虑首先对数组排序,排序会导致数组直接变为一个递增的序列。本题依然是一个组合问题,所以无序,i 在for loop中依然是从startIndex 开始。与之前的去重逻辑不同,每一层会有一个uset 变量,是记录本层元素是否重复使用,新的一层uset都会重新定义,不是之前去重那样的全局变量,同样回溯的时候也不需要删除元素,也是在树层去重。
2024-05-16 05:48:04
179
原创 代码随想录算法训练营第二十八天| LeetCode93.复原IP地址 、LeetCode78.子集、LeetCode90.子集II
这里返回的数字类型是List 类型,那么可以直接操作String s,可以通过字符串拼接等来生成最终符合IP Addresses 的字符串。这与上一个题目获取回文字符串的思路相似,同样是获得分割后的字符,使用startIndex 来作为分割线。String.substring 函数的start 和end 是左闭右开的,那么就会有s.substring(0, i + 1) 来获取前i 个字符组成的字符串。
2024-05-14 22:49:51
350
原创 代码随想录算法训练营第二十七天| LeetCode39. 组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串
判断是否是回文子串用的是双指针法,一个指针从前向后,一个指针从后向前,如果前后指针所指向的元素是相等的,就返回true(是回文字符串),否则返回flase (非回文字符串)。实现的方式为:在处理candidates 数组之前对其进行排序,在每次在for loop 的添加之前会先与target 进行比较,如果大于target ,则break ,不再进行后面的比较。在这里的去重指的是树层去重,如果数组是[1, 1, 2]那么选择两个元素的话,选择第一个1 和2 ,和第二个1 和2 是相同的,这一组就需要去重。
2024-05-13 01:43:49
354
2
原创 代码随想录算法训练营第二十五天| LeetCode216. 组合III、LeetCode17.电话号码的字母组合
如果做了77 题后,这个题目可以用相似的思路。回溯三部曲:1. 确定递归函数的参数以及返回值:一维数组path来存放符合条件的结果,二维数组result来存放结果集。2. 确定终止条件:path 的长度等于目标长度k。3. 确定单层递归逻辑:path 收集每次选取的元素,用sum来记录path 里元素的和。
2024-03-24 22:59:11
182
原创 代码随想录算法训练营第二十四天| 回溯算法理论基础、LeetCode77. 组合
3. 单层递归逻辑:当加入startIndex 代表的节点(题目要求,从1 开始,到n 结束),在add 后,再次判断是否符合终止条件,如果达到了k 个数字,那么会removeLast,删除掉最后一个元素,加入新的元素作为最后一个,即为回溯。2. 确定终止条件:当if (path.size() == k) 代表的是当收集够了足够的元素后返回,即到了叶子节点)。考虑角度:回溯算法的步骤与递归算法相似以及回溯算法可以抽象为一个树。Combination 组合是无序的,需要注意12 和21 相同。
2024-03-24 05:47:27
325
原创 代码随想录算法训练营第二十三天| LeetCode669. 修剪二叉搜索树、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538.把二叉搜索树转换为累加树
递归三部曲:1. 确定参数以及返回值:有TreeNode 返回值,可以通过递归函数的返回值来移除节点。2. 确定终止条件:空节点返回。3. 确定单层递归逻辑。如果当前节点的值不在[low, high] 的区间中,要继续考虑其子节点是否在这个区间内,不可以直接删除。
2024-03-01 22:46:47
416
原创 代码随想录算法训练营第二十二天| LeetCode235. 二叉搜索树的最近公共祖先、LeetCode701.二叉搜索树中的插入操作、LeetCode450.删除二叉搜索树中的节点
根据二叉树的特性,如果一个节点的值处于两个目标值的之间,那么说明这个节点一定是最小公共祖先。题目规定所寻找的节点一定存在树中,所以只需要考虑向那一侧进行寻找。在递归法中,终止条件为遇到空值即可返回。
2024-02-27 23:35:01
342
原创 代码随想录算法训练营第二十一天| LeetCode530.二叉搜索树的最小绝对差、LeetCode501.二叉搜索树中的众数、LeetCode236. 二叉树的最近公共祖先
定义一个新的函数时,考虑返回值类型。如果需要返回值,那么说明这个函数需要返回某个特性、特点、数值。如果不需要遍历整个二叉树,只需要某个特定路径或者某个节点。在本题中,定义了一个全局变量记录了minimal value,所以不需要函数具有返回值。
2024-02-27 03:50:54
370
原创 代码随想录算法训练营第二十天| LeetCode654.最大二叉树、LeetCode617.合并二叉树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树
构造二叉树一般用前序遍历,是通过构造根节点再构造左子树、右子树实现。递归三部曲:1. 确定参数以及返回值,参数是int 数组,返回值是TreeNode 节点。2. 确定终止条件,数组的长度是1 时。3. 确定单层的递归逻辑。首先找到数据中的最大值,然后根据最大值分割数组,是否使用if 取决于终止条件,也可以删掉if 判断。
2024-02-26 07:37:08
392
1
原创 代码随想录算法训练营第十八天| LeetCode513.找树左下角的值、LeetCode112. 路径总和、LeetCode106.从中序与后序遍历序列构造二叉树
题干中的Bottom Left Tree Value 并不一定指的是左孩子节点,在此题中使用前序、中序、后序遍历都可以,三种遍历方式不同之处在于中间节点位置不同,但此题中并不会考虑中节点的位置,所以三种遍历都可以。第一种方法是层序遍历,使用的是迭代法。类似之前的层序遍历,建立一个队列来实现。区别在于在poll 出队列中第一个节点时,在i = 0(每一层的最左端节点),需要将第一个节点的val 赋值给result。第二种方法是递归法。递归中存在回溯,一般在递归的函数下方。
2024-02-18 03:17:27
1587
原创 代码随想录算法训练营第十七天| LeetCode110.平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和
平衡二叉树的定义是:二叉树的每个节点的左右子树的高度之差不超过1.如果计算二叉树的高度用后序遍历,二叉树的深度用前序遍历,原因如下:二叉树的高度:叶子节点所在的层为1,所以是汇总左右孩子情况后 + 1,返回给父节点,层层向上返回,所以是左右中——后序遍历。二叉树的深度:根节点所在的层为1,逐步向下递增,符合层层向下的逻辑,所以是中左右——前序遍历。递归三部曲:1. 考虑参数和返回值:参数是节点、返回值为int(高度值)。2. 终止条件:如果node == null,则代表到了末端节点。
2024-02-15 22:01:57
399
1
原创 代码随想录算法训练营第十六天| LeetCode104.二叉树的最大深度、LeetCod559.n叉树的最大深度、LeetCode111.二叉树的最小深度、LeetCode222.完全二叉树的节点个数
深度:根节点到该节点的节点数,主要用前序遍历。高度:该节点到叶子节点的节点数,主要用后序遍历。本题中的最大深度,即为二叉树的高度,所以选择使用后序遍历。在这个过程中没有单独设置一个变量来记录层数,而是使用遍历到末端节点后逐次加一得到的。
2024-02-11 20:24:39
934
1
原创 代码随想录算法训练营第十五天| LeetCode102.层序遍历、LeetCode226.翻转二叉树、LeetCode101.对称二叉树2
本题是使用层序遍历算法,二叉树有多少层,List<List<Integer>> result 就有多少个元素,result 里每一个元素又是一个List<Integer> 形式。使用队列来完成,首先放入根节点,然后放入根节点的左右节点,需要一个额外的变量来记录放入了多少个元素(以每一层为单位),方便在输出的时候知道输出几个元素。每次输出的元素都需要顺序放入该节点的左右子节点(如果非空)。当队列为空时代表已经遍历完成。
2024-02-07 05:00:54
409
1
原创 代码随想录算法训练营第十三天| LeetCode239. 滑动窗口最大值、LeetCode347.前 K 个高频元素
单调队列是一种单调递增或者单调递减的队列。在Java 中是通过Deque 接口来实现的,其中部分常用函数有:addFirst(E e), removeFirst(), getFirst(), addLast(E e), removeLast(), getLast()。之所以选择单调队列,是因为可以两端添加(称呼为:入口、出口)或者删除元素以及排序,在本题中选择的单调队列是单调递减的队列。
2024-01-31 06:49:49
334
原创 代码随想录算法训练营第十一天| LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值
首先分析出如果不匹配一共有三种情况,所有的情况都可以被归类为以下三种情况中。在分类讨论之前,先通过字符数目剪枝一些不符合的情况,字符数如果为单数,那么一定存在不匹配的情况,此时返回false。每次遍历到左括号时,放入栈中时放入的是,当遇到右括号时,比较最后的一个元素是否符合。第一种情况在遍历完字符串并通过栈消除后,会依然存在未匹配的右括号。第二种情况是还未遍历完字符串即出现了与栈中最后一个元素不符合的情况。第三种情况是字符串未遍历完,栈已经变成空栈。
2024-01-29 03:01:00
770
原创 代码随想录算法训练营第十天| LeetCode232.用栈实现队列、LeetCode225. 用队列实现栈
Stack 类提供的函数:push(E item): 将指定元素压入栈顶。pop(): 移除并返回栈顶的元素。peek(): 返回栈顶的元素但不移除。empty(): 判断栈是否为空,为空返回true,否则返回false。search(Object o): 返回对象在栈中的位置,如果对象不在栈中,则返回-1。如果使用栈(LIFO)实现队列(FIFO)的功能,需要建立两个栈,stackIn 和stackOut 用于将栈内元素顺序调整为队列顺序。队列会先输出1 ,而栈中会先输出3。
2024-01-26 23:45:39
382
1
原创 代码随想录算法训练营第九天| LeetCode28. 实现 strStr()、LeetCode459.重复的子字符串
KMP算法:主要是解决一个字符串中是否出现了另一个字符串的问题。前缀:包括首字母但不包含尾字母的所有前缀,例如:abca,前缀是:a, ab, abc。后缀:包括尾字母但不包含首字母的所有后缀,例如:abca,后缀是:a, ca, bca。KMP算法是找到最长相等的前后缀,例如:在aabaa 中,最长相等前后缀为aa。如果出现不匹配时,会指向前一个元素的最长相等前后缀。
2024-01-25 07:20:32
409
原创 代码随想录算法训练营第八天| LeetCode344.反转字符串、LeetCode541. 反转字符串II、LeetCode151.翻转字符串里的单词
双指针操作,比较简单。
2024-01-24 04:28:40
405
原创 代码随想录算法训练营第七天| LeetCode454.四数相加II、LeetCode383. 赎金信、LeetCode15. 三数之和、LeetCode18. 四数之和
解题思路类似Two Sum 题目,区别在于哈希映射的(key, value) 分别代表什么。将a 和b 相加,c 和d 相加后遍历,相比于暴力解决方法的,这样的时间复杂度为。类似求两个数的和为0,将a 和b 的和映射在哈希数组中,因为此题不需要去除重复值,所以用value 来保存a + b的和出现的次数,如果遇到- (a + b) 的值出现在(c + d) 中,则出现value 个符合条件的值。HashMap 的put (key, value) 方法如果遇到key 存在,则将替换旧值为新值。
2024-01-23 21:23:00
1614
原创 代码随想录算法训练营第六天| LeetCode242.有效的字母异位词、LeetCode349. 两个数组的交集、LeetCode202. 快乐数、LeetCode1. 两数之和
Anagram定义: An用哈希法的情况:判断一个元素是否在集合中,此题目满足条件。哈希法共有三种表现方式:数组、set集合、map映射。数组在此题中有更快的速度,所以选用数组。将第一个字符串中的字母分别映射到哈希树上,用record 数组来记录每个字母的数量,在record 数组中将第二个字符串中出现的字母减去。如果record 数组不全部为0,则说明两个字符串存在不同的字母。
2024-01-22 21:09:44
758
原创 代码随想录算法训练营第四天| LeetCode24. 两两交换链表中的节点、LeetCode19.删除链表的倒数第N个节点、LeetCode160.链表相交、LeetCode142.环形链表II
首先建立虚拟头节点,方便处理前两个节点的交换,注意cur 指针应该指向交换节点的前一个节点,所以下图中橙色矩形代表的是指针cur 应该指向的位置(不是节点,如果交换后依然是同样的位置,但不再是原节点)。交换的步骤:首先cur 指针遍历到交换节点的前一位,新建两个临时变量temp 和temp1 保存1 节点和 3 的节点(防止在cur.next = cur.next.next 后找不到1 节点)。
2024-01-21 23:01:12
765
原创 代码随想录算法训练营第三天| LeetCode203.移除链表元素、LeetCode707.设计链表、LeetCode206.反转链表
使用添加虚拟空节点的方法,在链表中删除元素可以用两个变量(pre 和cur )遍历整个列表(也可以用一个变量cur 遍历)。一个变量pre 指代前一个元素,一个变量cur 指代当前元素。添加虚拟空节点方法的优势是可以使用统一规则删除元素。时间复杂度:O(n).
2024-01-20 07:16:21
377
原创 代码随想录算法训练营第二天| LeetCode977. 有序数组的平方、LeetCode209. 长度最小的子数组、LeetCode59. 螺旋矩阵II
第一次做:没有考虑指针,偷懒用了Arrays.sort() 来排序。题目没有要求in-place,所以考虑新建一个数组来保存新值。还是考虑用指针来完成,原数组是非递减的数组,但平方后变为两边数值大,中间的数值最小。那么考虑新建左右两个指针,将较大数值放在新数组的最后一个元素中,依次比较并存储。需要注意i <= j 的判断标准,当i = j时,代表两个指针指向同一个元素,也是需要输出的。时间复杂度 O(n).
2024-01-19 03:38:36
965
1
原创 代码随想录算法训练营第一天| LeetCode704. 二分查找、LeetCode27. 移除元素
第一次做题:对于二分查找有印象,但自己写的时候<= or < 以及right和left的边界值混乱,结果是没有运行成功。观看讲解视频后,有了更清晰的理解和想法。在看完视频后先总结了视频中的方法以及边界值如何考虑,巩固思路后先写了左闭右闭的方法,完成第27题后,再返回这个题目完成左闭右开的方法。看完视频后需要整理思路再完成题目,在这个过程中如果有思路模糊或者自己不确定是否是这个原因的地方,再次回到视频或者文档中,观看后需要在笔记中重点标出,后期会知道这是当初有漏洞的地方。首先,。时间复杂度 O(n).
2024-01-18 03:53:25
1774
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人