- 博客(25)
- 收藏
- 关注
原创 算法训练营打卡Day27 | 回溯算法part03 | LC39. 组合总和 LC40.组合总和II LC131.分割回文串
其次,为了防止重复的元素分支结果重复计算,在每一层上,如果当前元素和上一个元素相同,且当前元素所对应的index>这一层的startIndex,那么目前这个数字就跳过。优化策略:对数组进行排序,这样循环过程中如果遇到一个元素加上之前元素和>target,那么其后的元素都不需要检验了。,这样循环过程中如果遇到一个元素加上之前元素和>target,那么其后的元素都不需要检验了。如果不是,放弃当前排列向下搜索的可能性,如果是,那么继续向下搜索。二、LC40.组合总和II。一、LC39. 组合总和。
2023-11-09 16:48:55 193
原创 算法训练营打卡Day25 | 回溯算法part02 | LC216.组合总和III LC17.电话号码的字母组合
需要新建一个String[]数组保存每个数字对应的字符,因为7和9对应的字符数量是4,其他都是3,所以直接不用String[]数组计算效果可能会不好。: k == 0 (path的长度等于规定长度 path.size() == k), 如果此时target == 0,加到结果里,不然就返回。1. 开始递归,从当前index开始,可选元素数量不足k个。2. 已选元素总和如果已经大于n了,那么往后遍历就没有意义了,直接剪掉。:集合固定的就是9个数[1,...,9],所以for循环固定i
2023-11-04 13:23:43 176
原创 算法训练营打卡Day24 | 回溯算法part01 | LC77. 组合
再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。,是的,我指的是所有回溯法的问题都可以抽象为树形结构!
2023-11-02 22:58:30 164
原创 算法训练营打卡Day23 | 二叉树part09
1. 如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。2. 如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。取哪一个都可以,只不过构成了不同的平衡二叉搜索树。1. 递归:前/中/后 序遍历,根据需要选择合适的遍历方式。终止条件:修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。适当的时候可以用变量pre记录当前节点遍历的前一个节点,方便解决问题。三、 LC538.把二叉搜索树转换为累加树。
2023-11-02 15:05:31 117
原创 算法训练营打卡Day22 | 二叉树part08
5. 删除节点左右都不为空,找到左子树的最大孩子(最右节点),把删除节点的右子树给它,或者找到右节点的最小孩子(最左节点),把删除节点的左子树给她。3. 如果不符合以上两种情况,说明一个节点在左子树,一个节点在右子树,或者存在等于cur.val的情况,直接返回cur就满足情况了。3. 删除节点左不为空 ,右为空,将删除节点的父节点指向删除节点的左节点。4. 删除节点左为空 ,右不为空,将删除节点的父节点指向删除节点的右节点。:终止条件,递归遇到空节点,说明到达叶子节点,可以插入。
2023-11-01 17:39:01 92
原创 算法训练营打卡Day21 | 二叉树part07
一、LC530.二叉搜索树的最小绝对差中序遍历,用一个TreeNode记录前一个节点,然后计算比较当前节点和前一个节点的差值。二、LC501.二叉搜索树中的众数。
2023-10-31 14:17:21 122 1
原创 算法训练营打卡Day20 | 二叉树part06
如果index右边还有元素 (index + 1 < right),构建右子树,不然说明是叶子节点,右子树就是null。往下递归给root1的左右子树赋值(主要是终止条件,比如root1.left为空,需要root1.left = root2,这样可以继承root2.left的值)。,然后比较前一个节点的值是否小于当前节点,如果是,那说明是递增的,如果不是,说明不是递增的,不是二叉搜索树。思路:中序遍历(中左右顺序遍历),将值都存入数组中,如果数组是递增的,那么是二叉树是搜索树。迭代法,如果root!
2023-10-30 21:05:45 140 1
原创 算法训练营打卡Day18 | 二叉树part05
接下来,我们使用“==”判断person1和person2中的address是否是同一对象,结果为true,即两个对象的address成员变量指向的是同一个地址。浅拷贝只是将原始对象的引用类型成员变量复制到新的对象中,因此新对象中的引用类型成员变量与原始对象中的成员变量指向同一对象。此外,因为要找到所有合规路径,所以不能找到一个就提前返回,必须遍历所有可能的路径。if(a==b|a==c){...},不管a= =b是否成立,都要去判断a= =c;如果a= =b成立,不会去判断a= =c;
2023-10-28 21:37:40 219
原创 算法训练营打卡Day17 | 二叉树part04
一、LC110.平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
2023-10-28 00:06:38 100
原创 算法训练营打卡Day16 | 二叉树part03
思路:递归顺序是后序遍历-左右中,因为需要先计算出左右子树的高度,取两者较大值返回给上一层,所以中间节点应该放在最后。迭代法层序遍历,第一个左右节点都为null的节点就是最小的node。:根节点到最远叶子节点的最长路径上的节点数。:二叉树中任意一个节点到叶子节点的距离。一、LC104.二叉树的最大深度。四、LC222.完全二叉树的节点个数。二、LC559.n叉树的最大深度。三、LC111.二叉树的最小深度。
2023-10-27 17:33:06 115 1
原创 算法训练营打卡Day13 | 239. 滑动窗口最大值 347.前 K 个高频元素 总结
一、LC239. 滑动窗口最大值暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法。我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。那么问题来了,已经排序之后的队列 怎么能把窗口要移除的元素(这个元素可不一定是最大值)弹出呢。
2023-10-24 13:48:56 123
原创 算法训练营打卡Day11 | 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
遍历字符串中的元素,左括号入栈,右括号和栈中最上面的元素比较,匹配的话继续比较,不匹配就返回false。我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?:遍历输入,遇到数字加入栈中,遇到运算符号将栈中最顶部的两个元素pop做运算,将结果放回栈中方便后续计算。来说其实也是匹配问题,20. 有效的括号 是匹配左右括号,本题是匹配相邻元素,最后都是做消除的操作。那么栈的目的,就是存放遍历过的元素。本题也是用栈来解决的经典题目。
2023-10-22 20:28:37 146 1
原创 算法训练营打卡Day10 | 理论基础 232.用栈实现队列 225. 用队列实现栈
Queue接口继承了Java的Collection接口,并扩展了一些额外的方法,以提供队列特定的功能。当输出栈不为空时,如果输入栈有元素,新加的元素都加入到输入栈中,有元素弹出时,只有输出栈为空的时候,元素才会由输入栈加到输出栈,不然元素都保留在输入栈中,等到输出栈为空再加 过去。,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈。,这里要注意输入栈和输出栈的关系。
2023-10-20 22:42:16 186 1
原创 算法训练营打卡Day9 | 双指针回顾
本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为$O(n)$。
2023-10-19 15:46:14 102 1
原创 算法训练营打卡Day9 | 28. 实现 strStr() 459.重复的子字符串字符串总结
在344.反转字符串 (opens new window),我们使用双指针法实现了反转字符串的操作,双指针法在数组,链表和字符串中很常用。接着在字符串:替换空格 (opens new window),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。那么针对数组删除操作的问题,其实在27. 移除元素 (opens new window)中就已经提到了使用双指针法进行移除操作。同样的道理在。
2023-10-19 15:40:03 103 1
原创 算法训练营打卡Day8 | 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
left++;right--;代码随想录移除多余空格将整个字符串反转将每个单词反转因为Java中String无法更改,所以需要转换成char array再进行操作。快指针查找空格,慢指针原地更新数组。反转数组两次得到原顺序。//删除字符串中多余的空格i++) {if (result[i] == ' ') {//空格跳过continue;//查找单词= ' ') {i++;//如果空格不是出现在开头,说明一个单词看完了,进行操作,反转字符串j < i;
2023-10-18 21:47:51 139 1
原创 算法训练营打卡Day7 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 哈希表总结
一般来说哈希表都是用来快速判断一个元素是否出现集合里。对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。哈希函数是把传入的key映射到符号表的索引上。哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。数组set(集合)map(映射)
2023-10-18 14:17:44 191 1
原创 算法训练营打卡Day6 | 哈希表原理 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
所以我们知道,最坏的情况下,算法可能会在 243 以下的所有数字上循环,然后回到它已经到过的一个循环或者回到 1。对于遍历的每一个元素i,查看target-i是否在map里,如果在,返回两个元素下标,反之将i加到map中,继续遍历。需要定义一个多大的数组呢,定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。
2023-10-16 22:27:07 200 1
原创 算法训练营打卡Day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
环形入口节点到 fast指针与slow指针相遇节点 节点数为y。相对于慢指针,快指针以每次一个节点的速度去靠近慢指针,所以。如果节点数量为偶数,最后会没有多出的节点 cur.next==null && cur.next.next==null。第一次走n+1步,不然最后慢指针落在倒数第n个节点,没有办法删除(需要前一个节点的指针)。,n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。如果n>1,那么相遇地点的指针在环内走n圈但最后还是会从头节点出发的指针在环入口处相遇)
2023-10-16 19:04:28 134 1
原创 算法训练营打卡Day3 | 203.移除链表元素 707.设计链表 206.反转链表
如果cur.next.next为null的话cur.next.val不存在会报错,也是这个原因所以cur.next.val == val时,因为cur.next.next还没有被检查过,所以不需要移动指针cur=cur.next。= null因为操作中会更新cur.next = cur.next.next,不确定cur.next.next是否为null。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。
2023-10-16 15:46:02 153
原创 算法训练营打卡Day3 | 链表原理
所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。链表每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。2.双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。的,如果想改动数组的长度,就需要重新定义一个新的数组。
2023-10-14 23:18:31 93
原创 算法训练营打卡Day2| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
双指针法,设置一左一右两个指针,从数组两端开始遍历。因为数组是非递减,所以平方最大值产生在数组最左或者最右。将元素从大到小加入数组中。
2023-10-14 16:41:44 123 1
原创 算法训练营打卡Day1| 704. 二分查找、27. 移除元素。
像Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机,所以看不到每个元素的地址情况。例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作。Java中,一维数组在内存中存储的时候,数组中元素的内存地址是连续的。数组可以方便的通过下标索引的方式获取到下标下对应的数据。Java的多维数组的每个维度的存储空间不是连续的。二维数组,三位数组内存地址不是连续的。不同编程语言的内存管理是不一样的。
2023-10-12 21:52:31 137
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人