自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 贪心算法part03|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

看见题目后,想着怎么用贪心的方法找到最优解,因为要找最大的和,那么如果数组中正数比负数多,并且负数的绝对值都小于正数,那么就由可能得到最大的和。所以我们可以先利用快速排序将绝对值大的数排到前面,并在k的次数没用完的前提下从前向后遍历将小于零的元素变成大于零的,如果将全部的数都变成正数之后,k的次数还没用完就可以可着最小的那个数变化,也就是数组中的最后一个。本题要求相邻的评分高的小孩都要比评分少的小孩多一个糖果,并且算出需要准备的最少的糖果,在我们遍历数组的过程中,需要和相邻的数进行比较。

2023-12-13 21:07:49 426 1

原创 贪心算法part02|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

我们用贪心的思路呢就是不考虑他到底是在最大范围之内具体跳几步,我们只看他的覆盖范围到哪,因为在他覆盖范围内的地方都可以跳到。本题还是用覆盖范围的概念去解,我们尽可能的找到每一个元素的最大覆盖范围,并记录下来,当这个覆盖范围遍历到最后的时候,去判断是否走到了终点,如果没有就将下一个最大覆盖范围赋给当前,继续遍历。本题要求的是最佳时机买卖股票的总利润,我们用贪心的思路就是,后一天比前一天的价格高我们才能得到利润否则就亏损了,所以我们要把所有正的利润相加。

2023-12-06 21:29:20 391

原创 代码随想录算法训练营第三十一天|贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

第二中情况就是首尾元素,如果整个序列中只有两个元素并且不知道两个元素是否相等,但是prediff和curdiff的计算至少需要三个元素,这时候我们可以将序列中右边的元素定为一个序列,左边的作为初始元素 i ,在i的前面添加一个与 i 相等的i-1,这样就可以计算出摆动长度了。但是我们在真正实现的过程中多次遍历数组并删掉其中的值是在时间上耗费较大的,题目既然只让我们求最长的摆动序列的长度,我们就可以在数组遍历到峰值处时将计数器加1就可以了,没必要去真正的删除元素,所以思路如果选的不对就很容易陷入僵局。

2023-12-06 17:43:07 759

原创 力扣|51.N皇后、37.解数独

这道题是回溯算法中的难题,如果我们按照之前解回溯算法题去树形结构会发现与之前那些收集子集或集合不一样的点在于,我们需要用二维数组去构建一个棋盘,一行一行的去遍历,遍历列的时候就经过递归去遍历。最重要的是去重的过程,要进行列去重,45度去重及135度去重,因为是通过行遍历所以行不用去重。本题与n皇后类似,用递归回溯的方法去匹配看此空填1-9中那个数满足要求。

2023-12-03 20:08:47 407

原创 代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、47.全排列II

本题每种组合中可有重复元素,但是每种组合不能重复,这与子集II那道题非常相似,那道题是排序之后用used数组去记录是否取过某元素,但是本题不能排序,因为本题求递增子序列,排序后答案就不对了,而且递增子序列最短组合也要两个元素。该题是排列问题,与组合问题的差别就是,组合问题的组合之间不能有重复项,但是组合问题不是,所以应该对我们取过的数做一个记录,然后因为是全排列每次从数组中取数都要从头取,但是已经取过的数就不可再取,在这里我们可以用一个布尔型的used数组去记录。

2023-11-23 21:10:36 343

原创 代码随想录算法训练营第二十八天|93.复原IP地址、78.子集、90.子集II

本题与子集那道题的区别就是那道题集合中的元素是没有重复的,但是这道题有重复元素,要求是每个组合不能重复。所以就要对每个树层取元素的时候进行去重,可以定义一个动态的布尔型数组去记录此元素有没有被取出过。这里与组合总和II这道题类似。本题的递归函数与其他组合的题的不同在于终止条件,别的组合题基本都是在递归终止时将此组合放入二维数组,而本题是取集合的全部子集,所以在for循环中startindex每移动一次就要手机一个子集。与分割回文串的思路大致相同,都是模拟分割的一个过程,多看代码理解一下吧,有点难懂!

2023-11-22 17:34:32 26

原创 代码随想录算法训练营第二十七天|39.组合总和、40.组合总和II、131.分割回文串

本题在本层搜索逻辑中加了一个判断是否为回文子串的逻辑,如果是就将此子串复制下来push入一维数组中。本题中我们应该做的是数层去重,而不是树枝去重,在我们进入递归之前就要先将数组进行排序,因为如果数组中有重复的数字那么前一个数字的符合要求的组合就涵盖了第二个相同数字的符合要求的组合,(因为每次下标对应的数字要寻找与之有可能组合的数字都会从startindex下标开始向后找)。本题与其他的组合总和题的区别是,本题给出的数组中是有重复元素的,但是最后的结果集中又不允许出现重复的集合,所以本题涉及去重的过程。

2023-11-21 20:22:11 71

原创 代码随想录算法训练营第二十四天|回溯算法基础、77.组合、216.组合总和III、17.电话号码的字母组合

终止条件就是当digits字符串中的字符长度等于index,就将此组合存入result中,本级递归的目标是找到符合条件的集合,从下标为0开始,因为每个数字代表的是一组不同的字符串。运用两个动态数组,一个一维动态数组用来存放长度为K的组合,一个二维动态数组用来存放一维数组,本层搜索逻辑是找到开始下标startindex到n的数字区间中长度为k的组合,本层搜索的终止条件是一维数组长度等于k。通常在递归函数的下面是回溯的逻辑,人们通常说的回溯函数其实是递归函数,因为没有专门用于回溯的一个函数。

2023-11-21 16:12:12 47

原创 代码随想录算法训练营第二十三天|669.修剪二叉搜索树、108.将有序数组转化为二叉搜索树、538.把二叉搜索树转化为累加树

平衡二叉树的话就要考虑左右子树的高度问题了,我们可以尽可能的去让左右子树的高度相同,因为他给的数组是有序的,在本级递归中我们可以取数组的中间值作为根节点,左边的构造左子树,右边的构造右子树。因为本题是二叉搜索树,所以我们要充分利用二叉树的特性,本题仍然使用递归的方法,本级递归我们要将结果返回给本级的上级,在遍历的当前节点的值小于区间的最低界限时,再往下遍历的时候就可以只便利他的右子树,因为所有左子树的结点一定小于最低界限。依然是利用二叉搜索树的特性,但唯一不同的是遍历顺序变成了倒序遍历。

2023-11-16 18:37:49 33 1

原创 代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的结点

235.二叉搜索树的最近公共祖先235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)解题思路:本题可以用寻找普通二叉树的公共祖先的方法,也就是的上个题的思路,用双指针法。还有在本题中,这个数是特殊的,是二叉搜索树,我们知道二叉搜索树的特性,在二叉搜索树中左子树的所有节点的值都小于中结点,右子树所有元素的值都大于中结点。所以我们在遍历而二叉搜索树去寻找p和q的时候就可以先比较根节点和p、q节点的值如果根节点大于他们两个,就说明p和q在二叉搜索树的左子树,反之,则在右子树,如果根

2023-11-15 17:27:29 33

原创 代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

在此说明一下,因为是求二叉搜索数中的众数,题目规定二叉搜索树是左子树的所有节点小于等于中结点,右子树的所有节点大于等于中结点,所以cur指向元素要么大于小于,要么等于pre指向元素,不可能出现当前不等于,在移动指针过程中出现有元素与相隔若干元素的元素相等的情况。本级遍历需要返回的是p和q的上一级信息,最终要找到最近的。采用双指针的方式,cur指针指向当前遍历的元素,pre指针指向遍历元素的前一个,依旧是利用中序遍历,在遍历过程中可以利用指针比较两元素的差值,随时更新结果。第二个思路是我们可以。

2023-11-14 17:30:02 56 1

原创 代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

本题创造一个最大二叉树,题意大概就是选取数组中最大的元素作为根结点,最大元素的左边所有元素再作为一个新的数组构造一个最大的二叉树来作为原来二叉树的左子树,右子树同理。本题还是用递归的方式遍历顺序依旧是前序遍历,我们按照递归三部曲的顺序来理一下思路吧,1,确定返回参数类型,本题传入参数分别为两个二叉树的根节点,返回参数则是合并后的二叉树的根节点。本题还是采用递归的方法,采用中序遍历的遍历序列,在本级递归中利用pre指针记录前一个结点,并判断前一个结点的值是否小于当前节点,否则就返回false。

2023-11-13 17:45:32 32

原创 代码随想录算法训练营第十七天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

从根节点开始遍历,先将根节点的值存入一个int型的vector数组,然后再遍历他的左孩子和右孩子,直到为空才回溯将位置回退到根节点。其次,要知道我们在遍历这个二叉树求每个节点高度时应该用什么样的遍历方式,因为我们要得到左右子树的高度并返回根节点,所以我们应该用后序遍历。然后我们要确定这个叶子是左叶子还是右叶子,要把左子树和右子树的左叶子都算上,所以要使用后序遍历序列,将左子树和右子树的左叶子的值都记录下来,最后将和返回。首先,知道什么是叶子节点,叶子结点的左右孩子结点一定为空。

2023-11-11 22:08:31 39 1

原创 代码随想录算法训练营第十六天|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

前一个题我们刚求了二叉树的最大深度,那么可不可以将上个题中的求最大深度直接改成求最小深度,答案是不可以的因为如果直接改成最小深度,那么返回的答案就是左右子树的最小深度加1,如果左子树为空或右子树为空就将空的结点也算进去了,最终最小深度就为1了,所以我们在算的时候应该求右子树的最小深度加1.如果说我们我们想得到的是他的深度,我们是不是应该选择前序遍历序列,也就是中左右的遍历顺序,因为只有这样我们才能计算他的深度,但是在网络上搜索会发现大多数题解用的都是一种后序的遍历,那么后序遍历求得是什么呢?

2023-11-11 20:01:42 34 1

原创 代码随想录算法训练营第十五天|226.翻转二叉树、101.对称二叉树

本题用递归会好想一些,先定义一个函数然后把根节点传入,将根节点的左右孩子用swap函数交换,然后再将他的左右孩子传入函数,这个方法适用于前后遍历序列,中序遍历不适用,因为中序遍历序列先遍历左孩子,将做孩子的左右子树交换后,再去遍历根节点,将根节点的左右子树交换后,再遍历右孩子,这时你会发现先在遍历的这个右孩子刚刚作为左孩子已经处理过了,除非在遍历根节点前和遍历根节点后都将左孩子作为递归参数。还有就是如果用前序或者中序,再没比较玩之前就要将信息返回给上层,这是不可能的,所以不用前序和中序。

2023-11-08 20:51:12 63 1

原创 代码随想录算法训练营第十四天|二叉树理论及二叉树的遍历

int val;

2023-11-08 17:53:32 49 1

原创 代码随想录算法训练营第九天|KMP算法

KMP算法呢,是使用字符串匹配的题目,当文本串和模式串去匹配的时候,一般我们可能会想到用for循环去一遍一遍的匹配,大概思路就是每匹配一次就将模式串再从文本串的下一位开始匹配,直到匹配上为止,这样时间复杂度就会很大,有可能会超出时间限制。而KMP算法是在文本串和模式串匹配一次未成功后,就将模式串从已经匹配到的字符串的后一位开始再进行匹配,那么怎么找到这个字符呢。友友们,今天这个KMP算法我有可能会一次性讲不明白,因为这个算法听说是要学好几遍才会运用,我今天第一天学思路还有点屡不清。

2023-11-06 20:12:45 33 1

原创 代码随想录算法训练营第十三天|239.滑动窗口最大值、347.前K个高频元素

用这个优先级队列去模拟小顶堆的数据结构并记录前k个高频率元素,为什么不是大顶堆,因为不管是大小顶堆他的底层逻辑都是树,如果是大顶堆那么根节点就是频率最大的元素,当这个优先级队列的长度超出了k,那么就要将超出的元素pop掉,这样就将频率最高的pop掉了,不符合题意了,所以我们选择小顶堆,最后在倒着pop一下就可以了。在解本题之前我们先了解两个概念:大顶堆和小顶堆(这种数据结构的底层逻辑是二叉树),最大堆的个节点大于子节点,最小堆的根节点小于子节点(pop的时候从根节点开始)

2023-11-06 18:22:53 47 1

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

这道题是栈和队列中比较经典的一道题,本题就是用栈来解决,主要有三种括号不匹配的情况,一是左括号多余,二是右括号多余,三是括号的个数是偶数左右括号数也相等但是匹配不上。前提:逆波兰表达式是一个合法表达式,在实现这个表达式的过程中用栈来作为实现的媒介,大体思路就是,遍历字符串将数字推入栈,遇见运算符就将栈中数字推出计算后就将得出的数字再存入栈。本题还是用栈解决,先将遍历到的字符串中的字符与栈中比较,有相等的就将栈中的推出,没有就压入栈中。1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

2023-11-04 20:00:53 50 1

原创 代码随想录算法训练营第十天(栈stack和队列queue)|232.用栈实现队列、225.用队列实现栈

基础知识点:栈和队列就是一个是先进后出,一个是先进先出,因为栈只有一个口就是栈顶,队列的话就像排队一样先来的肯定是先走。注意:如果想使用别的容器来实现栈和队列的话,这个容器必须要具有栈和队列的提供的各种接口功能。在C++中的定义与链表不同,栈与哈希表中的set和map数据结构都可以看作一个数据集合但是他们的区别就是栈的底层逻辑是一个底层的容器,只对外一个统一接口有点类似那种可插拔的数据容器,不可以遍历自身的元素,只是提供了push和pop的接口。set和map都提供了迭代器可以遍历自身元素。

2023-11-03 20:53:08 32

原创 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串II、151.翻转字符串里的单词

本题的没有什么具体的算法,就是模拟题目要求的一个过程,在我们遍历一个字符串的过程中通常喜欢让i每循环一次加1,但是在本题中,它是每2k使其中的一个k反转,所以我们遍历的时候应该每循环一次让i加2k,这样就不用去专门找每到2k的条件了,如果字符串的长度够,那么每循环一个2k就将字符串从i 到 i+k 个字符反转,如果长度不足2k但是足k就将i 到i+k 个字符反转,如果长度不足k,就将i到字符串结尾的字符反转。这道题,但是反转字符串这个题要比反转链表简单得多,因为他是数组的结构,元素之间的位置是连续的。

2023-11-01 18:12:32 61 1

原创 代码随想录算法训练营第七天|454.四数相加II、383.赎金信、15.三数之和、18.四数之和

在此题中,我们对数组排序后,就需要遍历数组用一层for循环,其中i从数组的下标为零的位置开始,再定义一个left指针指向i+1 位置,定义一个right指向数组的最后一个位置,在遍历的过程中left 和right 逐渐向中间靠拢,如果i,left,right 三个指针指向的元素的和大于0,就说明right指向的元素偏大,将right向左移,和小于0说明left应该向右移,和等于0 就返回这个三元组。最后,就是去重的过程,题目中说的时三元组不能重复,不是三元组中的元素不能重复。今天的题目结束,继续加油!

2023-10-31 22:05:26 50 1

原创 代码随想录算法训练营第六天|242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

友友们,链表一章结束了,你们对链表的掌握有多少啦?上一篇文章挑选了关于链表操作的比较典型的例子,希望大家多多复习,融会贯通!接下来就要开启哈希表这一章了,说实话我的数据结构没学完,对于哈希表是一概不知,我会是挺害怕自己跟不上进度的,加油吧!哈希表的应用:在我们看到需要我们快速判断一个元素是否在集合中或者判断一个元素是否出现过时,我们可以使用哈希法。

2023-10-30 22:02:52 65 1

原创 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、142.环形链表II、面试题02.07链表相交

本题采用,虚拟头节点和快慢指针的方法,难点在于如何找到倒数第N个位置,首先将快慢指针都指向虚拟头节点,这样就不用考虑头节点是否会改变的问题,也就是不用单独处理头节点,先让快指针向前移动n步,这样使快慢指针永远相差n步,再向后同时移动快慢指针直到快指针指向空,这样慢指针正好指向要删除的节点,但是我们要删除一个节点必须要找到此节点的前一个结点,所以先让快指针移动n+1步,让两个指针永远保持n+1步的距离,最后慢指针就刚好指向要删除结点的前一个。19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

2023-10-28 12:25:10 223 1

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

友友们,通过前两天的练习和坚持,我们数组部分的算法题已经学完了,不知道大家理解得怎么样,可以多做题多思考,题目做不出来不要死磕看看题解学习一下别人的思路哦!

2023-10-27 21:36:59 341

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

中使用的思想很相似,在螺旋矩阵这里我们采用左闭右开的思想,将矩阵每行或每列的最后一个点交给相邻的列或行。还有一点就是矩阵n是奇数还是偶数,如果是奇数,这种左闭右开的形式势必会使中间的一个坐标为行标和列表相等(nums[n][n])的位置空出来,所以当n是奇数时,单独给中间空出来的赋值。温馨提示:如果看完代码还不明白可以调试一下看看具体过程,也可以自己在纸上倒腾一遍,大家加油!这个题使用的思想是循环不变量的思想,也就是先定位号自己的区间是左闭右闭还是左闭右开,这点与。相关题目:904、76。

2023-10-26 18:02:58 480

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

我们先来看第一种(左闭右闭):left和right 相当于在一个闭区间right的初始值为数组长度-1,这个闭区间包括left和right,所以在限制循环条件时left应该是能等于right的,如果nums[mid]>target,此时区间变为[left,mid - 1],所以就将right 移到mid - 1位置,(因为nums[mid]不等于target,所以下标为mid的数字排除在外)。

2023-10-25 15:52:17 744 1

空空如也

空空如也

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

TA关注的人

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