自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 代码随想录算法训练营day36|无重叠区间、划分字母区间、合并区间

这道题和引爆气球有点类似,我们需要找到重叠的区间,将其删去。先根据start进行排序,随后找出当前区间的左边起点在前一个区间的end之内的区间就是重叠区间,即我们需要删除的区间。第一版代码错误原因,我们更新右边界时,不能直接选择上一个边界,因为有可能当前边界的右边界更小,我们需要选择更小的那个边界,这样才能获取的最少的删除区间数目。

2023-04-19 10:29:59 104

原创 代码随想录算法训练营day35|柠檬水找零,根据身高重建队列、用最少数量的箭引爆气球

使用HashMap来记录上手的零钱信息?不需要,直接使用变量来记录零钱信息比如bills等于5,相当于直接收入5块,bills等于10,我们需要从零钱中减少5,增加10,如果为20,我们需要从零钱中减少一个5,一个10,收入一个20或者减去3个5,收入一个20。每次找零判断对应的数额是否满足要求。

2023-04-18 10:32:28 99

原创 代码随想录算法训练营day34|k次取反后最大化的数组和、加油站、分发糖果

能否直接使用排序API?如果使用了排序API之后呢,先判断当前元素是不是负数,如果是,就将其取反。直到当前元素不是负数,就一直对其取反。错误点:当我们的数组剩余变化次数为奇数时,而最后一个待变换的值为正数,它比前一个带变换的值变为正数后大,此时我们需要对前一个进行重复变换。我们直接在k范围内将数组中的元素变为正数后,再去判断k是否大于0,如果是,还需要进一步判断。

2023-04-17 10:49:04 105

原创 代码随想录算法训练营day32|买卖股票的最佳时机Ⅱ、跳跃游戏、跳跃游戏Ⅱ

2023.4.15 买卖股票的最佳时机Ⅱ如何利用贪心的思路来解决?使用画图的方式来理解贪心,问题是如何使用代码来实现。显然,我们的最大利润就是我们将数组画为曲线是的上升段的净增值,我们只需要加上上升段的值即可。

2023-04-15 11:33:10 92

原创 代码随想录算法训练营day31|分发饼干、摆动序列、最大连续子数组

要尽可能满足数量多的孩子,因此我们的饼干尺寸最好与胃口贴合,所以我们可以先将两个数组排序后,从后往前遍历,这样我们就能从最大胃口的孩子和最大尺寸的饼干开始比较。(试想一下,如果不排序的话,可能会有如下情况发生,加入有两个胃口分别为1,2的孩子,而我们的饼干尺寸也为1,2,如果我们使用大的饼干尺寸2去满足小的胃口1,那么剩下一个孩子就不能得到满足。因此,我们必须使用排序后来进行比较才能满足数量最多的孩子。),如果不符合,就继续向前比较。即利用排序加双指针的思想。

2023-04-14 10:38:28 53

原创 代码随想录算法训练营day30

右斜线,在同一条斜线上的数值,我们发现x+y都是相等的,且数值也处于[0,n-2]之间,因此,我们可以使用两个boolean数组来存放对应斜线是否存在棋子的信息。该方法与valueOf(char[] data)有点类似,但是valueOf是犯规一个新的字符数组,并不会使用数组中的字符创建新的字符串对象。我们的斜线对应有左右斜线,发现左斜线如果用y-x,其分布的数值在[-n+1,n-1]之间,如果统一加上n-1,其数值就在[0,n-2]之间。将指定的数值value填充给每个array元素。

2023-04-14 10:35:56 34

原创 代码随想录算法训练营day29|递增子序列、全排列、全排列Ⅱ

这道题既不是所有节点,也不是所有叶子结点,如何确定终止条件?其实还是全部节点,我们只需要对加入结果集的元素进行筛选就行了题目给出序列并不是一个递增的序列,只是给的例子是递增的,这需要我们在实际中去判断它是否是递增的。此外,关于去重处理,由于本题是不能对其进行排序处理的,所以我们需要使用哈希表来进行去重的操作几个关键点:1.实际上本题还是遍历的所有节点,并不只是叶子结点,因此不需要return处理,但是我们的节点也是有要求的,必须长度大于等于2,这一点可以使用条件判断来处理加入结果集的数据。

2023-04-12 10:49:38 36

原创 代码随想录算法训练营day28|复原IP地址、子集、子集Ⅱ

也是进行切割操作。思考一下终止条件:我们的切割位到达了字符串末尾。同时还有一些小要求,即每个小子串处于0-255之间,如果超过一位的话,不能由0开头。同时,回溯的时候也需要控制我们的删除区域。

2023-04-11 11:28:34 45

原创 代码随想录算法训练营day26|组合总和、组和总和Ⅱ,分割回文串

和组合总和Ⅲ的思路很像,区别在与我们的数字是可以重复利用的,因此递归的start位置要改动一下。如何才能进一步实现剪枝操作呢?实际上,我们的sum>target判断虽然不会进入后续的递归,但是还是要进入一次递归后再返回的,其实我们可以直接判断而不用进入这层递归,直接在for循环里面实现,给for循环加一个条件判断,

2023-04-10 11:40:39 54

原创 代码随想录算法训练营day24|回溯算法

没接触过回溯算法,第一次遇见有点模糊的感觉,需要多加练习。

2023-04-09 14:43:06 37

原创 代码随想录算法训练营day25|组合总和Ⅲ、电话号码的字母组合

如何才能算出他们的相加值?使用一个变量来记录不使用剪枝的话会导致时间复杂度过高,如何才能使用剪枝操作?我们所做的剪枝操作,一是当我们的sum之和大于了n时,后面的无需再进行递归了,直接返回即可而是经典的组合中的剪枝操作,就是当我们的结果集还需要加入的元素个数与目标集合剩余元素个数不匹配时,也不进行递归了。即经典的 i < n - ( k - path.size()) + 1。

2023-04-09 14:42:01 47

原创 代码随想录算法训练营day23|修剪二叉搜索树、将有序数组转换为二叉搜索树、把二叉搜索树转换为累加树

思路:遍历而叉搜索树,如果当前节点值等于右边接,就删除其右子树,如果当前节点大于了右边界,删除起右子树,同时链接其左子树,继续遍历左子树。如果当前节点值等于左边界,删除其左子树,如果当前节点值小于左边界,删除左子树后,继续遍历右子树。

2023-04-08 15:32:31 34

原创 代码随想录算法训练营day22|二叉搜索树的公共祖先、 二叉搜索树的插入操作、删除二叉搜索树中的节点

普通的二叉树可以直接利用后序遍历来递归找对应节点,那么对于一个二叉搜索树,有什么可以利用其特性的地方?首先最近公共祖先存在两种情况:1.不是其本身节点:此时,其p,q节点一定是在祖先节点的左右子树中的,根据二叉搜索树的性质,其左子树的所有节点都小于根节点,右子树的所有节点都大于根节点,因此,从根节点开始遍历,此时第一次找到的节点是就是我们需要的,就是找到那个root.val 比其中一个大比另一个小的点,如果p,q不在根节点的左右子树里面,那么一定在其左子树的左右子树或者右子树的左右子树中。

2023-04-05 15:28:59 132

原创 代码随想录算法训练营day21|二叉搜索树的最小绝对差、二叉搜索树的众数、二叉树的最近公共祖先

我们知道通过中序遍历得到的二叉搜索树就是一个递增的数组。那么如何才能得到两个节点之间的差值呢,我们应该想到需要记录上一个节点,但是如何在递归中去记录上一个节点呢?实际上,我们只需要定义一个全局变量的节点,初始化为null,进入中序遍历时,令其在中序时等于当前节点这样,当遍历到了叶子结点时,他就会等于叶子结点,而我们的计算操作放在赋值之前,这样就会使得这个指针永远是比当前指针落后一位的。

2023-04-04 14:13:49 45

原创 代码随想录算法训练营day20|

思路类似于根据后序后中序数组构建二叉树。也是一个类似的过程。不同之处在于我们如何找到这个数组里面的最大值?猜想:构建一个重复的数组,对其进行排序处理,然后将原来的数组放入哈希表中,这样我们就能根据排序后的数组来查找原数组中对应的最大元素了。然而该猜想是错误的,因为对数组排序后会破坏其左右区间,无法判断最大值是在左子树还是右子树。我们直接使用循环来找到最大值。

2023-04-03 14:11:14 41

原创 代码随想录算法训练营day18|找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树

因此,我们可以先找到后续遍历数组中的最后一个元素,确定总的根节点的位置,随后在中序数组中找到这个根节点的位置,将其划分为左右区间,这样,我们就可以找到左子树的根节点与右子树的根节点了,方法就是根据中序数组根节点划分出来的左子树区间,找到起长度大小,在后序数组中找到对应长度的最后一个元素2,就是我们左子树的根节点,随后再次重复这个过程,即找到左子树根节点后,继续划分左子树的左区间和右区间。此时我们再从后续数组的右区间节点的最后一个节点确定为右子树的根节点,再次在中序数组中找到根节点的位置,重复这个过程。

2023-04-02 12:34:29 84

原创 代码随想录算法训练营day17|平衡二叉树、二叉树的所有路径、左叶子之和

要判断一个二叉树是否为平衡二叉树,我们首先要判断其根节点的左右两个子树的高度差不能超过1,再去分别判断左右两个子节点左右子树高度差不超过1,以此类推。因此我们可以使用递归的方式来完成。首先判断返回类型和传入参数。显然,返回类型是布尔类型用于判断左右两个子树是否满足平衡二叉树传入参数,需要传入左子节点和右子节点分别作为左右子树的根节点?终止条件,当左子节点和右子节点同时为空,返回true,当左子节点和右子节点都不为空,继续进行判断。当有一个节点为空,继续判断,传入另一个不为空节点的参数。

2023-03-31 12:07:40 40

原创 代码随想录算法训练营day16|二叉树最大深度、n叉树最大深度、二叉树最小深度、完全二叉树的节点个数

逻辑很简单,我们只需要在判断二叉树最大深度的BFS代码中稍作修改即可,求最大深度我们需要一直将所有节点判断完,而求最小深度则不然,我们需要找到一个叶子结点,因此,需要在队列取出的节点中判断是否为叶子结点,如果是,则直接返回高度+1即可。总的节点个数等于根节点个数加上左子树节点个数加上右子树节点个数,而左子树节点个数又等于左子树根节加上其左子树节点个数和右子树节点个数,这是一个递归的过程,因此我们可以借鉴之前求最大深度的思路,使用递归完成。退出条件就是当前节点为null,返回高度0。

2023-03-30 14:03:18 45

原创 代码随想录算法训练营day15|二叉树的层序遍历、翻转二叉树、对称二叉树

前面的前、中、后序遍历都是通过深度优先遍历来实现的,而我们二叉树的层序遍历需要通过广度优先遍历来实现。深度优先遍历时通过栈来实现的递归操作,而广度优先遍历需要我们一次遍历一个层的节点,这符合先进先出的理念,需要我们使用队列来完成。如何才能实现一次遍历一个层的节点呢?对于头结点来说,它一定只有一个节点,我们直接将其存入队列中,记录下其队列长度作为循环次数,从队列中按照之前获取到的队列长度取出节点并记录下其值。

2023-03-29 14:39:26 59

原创 代码随想录算法训练营day14|二叉树的前序、中序、后序、三种遍历方式

实现递归,我们需要搞懂几个关键步骤1.确定好递归方法的返回值和传入的参数2.确定好终止条件3.确定好执行的逻辑对于二叉树的前序遍历而言,我们的逻辑还是比较简单的,就是先遍历当前节点的val值,随后进入左子节点,直到到达了叶节点后,再遍历右子节点。重复这个过程。那么对应的终止条件就是,只要当前节点为null,我们就返回到上一个节点返回值:题目要求使用List返回,所以我们直接给递归方法传入一个List,不需要返回值,直接设为void。

2023-03-28 14:48:09 74

原创 代码随想录算法训练营day13|滑动窗口最大值,前k个高频元素

那么为了构造这样一个单调递减的队列,我们对每次push进来的元素进行特殊的处理,当当前队列为空时,直接push,否则,当加入的元素大于队列尾的元素时,删除队列尾的元素,直到队列尾元素大于待加入元素或者队列尾空,然后push。当滑动窗口移动的时候,我们需要pop掉数组的元素,显然,当待删除的数组元素小于滑动窗口的最大值时,它在这个滑动窗口的最大值加入的时候已经被移除掉了,此时无需在队列中进行pop操作,直到我们需要pop的元素就是当前滑动窗口的最大值时,他就是我们队列第一个元素,此时才需要执行pop操作。

2023-03-27 15:02:58 40

原创 代码随想录算法训练营day11|有效括号、删除字符串中的所有相邻重复项、逆波兰表达式求值

首先,有效括号的正确形势应该是唯一的。即左括号在前面,且左括号对应了一个右括号我们可以遍历字符串s的字符,如果是左边括号,我们将其对应的右边括号放入栈中。当检测到当前字符不为左边括号时,我们可以pop()出栈顶元素看其是否与我们的字符对应,如果不对应则代表不匹配,返回false,此外,如果还在遍历过程中栈已经为空,代表数量不匹配,也返回false。当结束循环时,我们的栈应该为空,否则也代表数量不匹配。2023.3.25 删除字符串中的所有相邻重复项使用栈来实现删除操作。

2023-03-25 11:46:20 30

原创 代码随想录训练营day10|用栈实现队列、用队列实现栈

如何才能用两个栈实现队列?思路:由于栈是先进后出,而队列是先进先出的,所以如果要想用一个栈实现队列是不可能的,name如何用两个栈来实现呢?我们可以将一个栈a用来接收输入,此时栈底的元素就是我们第一个元素,如果要将其输出,我们此时挨个将栈a的元素弹出到栈b,由于栈是先进后出,此时栈b中的最顶层的值就是栈a中的最底层的值,即最开始的值,由此就实现了先进先出的功能。

2023-03-24 17:53:28 39

原创 代码随想录训练营day09|KMP算法:找出一个字符串中第一个匹配下标、重复的子字符串

KMP算法的产生基于下面的一个实际场景:给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。如果我们采用暴力解法,即直接遍历每个字符串元素,设haystack的长度为n,needle的长度为m,从haystack的第一个字符开始遍历n个,如果不匹配,从下一个字符重新开始遍历。

2023-03-23 17:27:15 182

原创 代码随想录算法训练营day08|344.反转字符串、541反转字符串Ⅱ、剑指05.替换空格、151.翻转字符串中的单词、剑指58.左旋转字符串

如何使用O(1)的额外空间解决这一问题。使用临时指针temp解决。

2023-03-22 19:40:29 36

原创 代码随想录算法训练营day07|四数相加Ⅱ、赎金信、三数之和、四数之和

由于题目只需要求出有多少个数组能够满足要求即可,所以我们可以直接使用哈希表,先储存前两个数组的元素和的信息,令元素和为key,值value存放元素和出现的次数。随后在根据后两个数组中的元素和来判断哈希表中是否有对应的数,如果有,将value计入结果中即可。关键点,要想到把多个组别拆分为两组,一组计入哈希表,另一组根据要求结果计算出需要的值再哈希表中进行查找。之前都是遇到的两个组的情况,现在有四个组,突然不知道咋做了。。。没想到分段处理。

2023-03-21 14:41:24 76

原创 代码随想录算法训练营day06|有效的字母异位词、两个数组的交集、快乐数、两数之和

即遍历数组,在遍历时就将其放入哈希表(题目中已经说了每种输入只会对应于一个答案,因此排除了存在重复元素相关结果的情况),并检查目标元素减去当前元素在哈希表中是否存在,如果存在,就返回对应的下标。求交集,就是找到两个数组中元素相同的部分,因此我们可以先将一个数组的元素放入哈希表中,随后遍历另外一个数组,检查其元素在哈希表中是否存在,如果存在,就说明有交集。出现无限循环是有可能的,在这种情况下,类似于环形链表,会有重复的数出现,我们可以将计算后的数计入哈希表中,检测是否有重复的数即可。这种方法本质上也是哈希。

2023-03-20 21:12:21 66

原创 代码随想录day04|两两交换链表节点、删除倒数第n个节点、环形链表2

只想到了迭代法,递归想不出来。

2023-03-19 19:04:49 26

原创 代码随想录算法训练营第三天|203 移除链表元素、206反转链表

移除链表元素的关键点在于如何建立辅助指针帮助我们完成元素的删除。如果我们不建立辅助指针,试想一下,要想完成链表的删除,我们需要将待删除节点的next指向空,但是这样会导致之前的链表全部丢失,因此我们肯定需要一个辅助节点,来指向待删除节点的前一个节点,这样才能通过前一个节点的next直接指向待删除节点的next节点来跳过待删除节点,使得整个链表保持完整,同时删除待删除节点。代码实现。

2023-03-17 19:28:15 127

原创 代码随想录算法训练营第二天|leetcode 977 有序数组的平方 leetcode 209 长度最小的子数组 leetcode 59 螺旋矩阵

分析题目,由于可能存在负数,导致在求平方过后使得原本的非递减顺序变为无序状态,因此,我们自然而然的想到找到这个负数和正数之间的交接点。从这个交接点开始,分别向两边遍历,比较大小,将小的值插入新数组中。然而上述方法存在问题:1.我们需要去找到这个正负数之间的分界点2.从分界点向左右遍历的时候,需要判断是否到达边界,如果达到边界,需要做出额外的判断。t因此,我们可以考虑优化一下过程,由于原数组是非递减的,如果存在负数,那么在平方之后,负数部分是递减的,正数部分是递增的。

2023-03-16 20:31:12 249

原创 代码随想录算法训练营第一天|leetcode 704 二分查找 leetcode 27 移除元素

当我们的target>nums[mid],代表我们需要找的目标值在当前mid元素的右边(因为数组是升序的),我们需要更新左边界,令left = mid+1(因为mid值不等于target,mid值是没有意义的),再次计算出mid,重复比较。因为我们最开始的区间定义就是左闭右开,即右边界是无意义的,如果设定为了mid-1,此时右边界就变成有意义的数了,设定为mid,是因为mid已经比较过了,它不会与target相等,所以可以设定为右边界为mid。(自己做的时候能够做出左闭右闭区间,左闭右开不是很熟练)

2023-03-15 14:51:36 624 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除