算法day 0 准备阶段
摘要:本合集的算法问题内容来自leetcode以及代码随想录,顺序上与代码随想录的教学视频顺序一致,作答使用的语言为C++,大佬很强,我很菜,多学多练。 友情链接:: Leetcode:https://leetcode.cn/ B站代码随想录视频:https://www.bilibili.com/vide
阅读全文
posted @
2025-04-05 19:39
sakura430
阅读(17)
推荐(0)
算法day1 二分查找
摘要:题目描述: 思路: 二分查找是搜索问题的经典问题。在这道题中,我们已知有序且升序的数组nums,那么我们可以设置三个指针low,mid,high。其中,我们令low = 0,high = nums.size()-1,那么初始的mid即为(low+high)/2。随后我们要设置循环的判断条件,此时就可
阅读全文
posted @
2025-04-05 20:45
sakura430
阅读(39)
推荐(0)
算法day2 移除元素
摘要:题目描述 思路: 这里主要介绍的是一种采取快慢双指针的思路。我们可以设置快指针fast来获取数组的元素,慢指针slow来获取数组的位置。这样我们采用fast指针的循环对整个数组进行遍历,当当前的fast指向的元素不等于目标元素val时,我们就将fast指向的元素更新到slow指向的位置,随后fast
阅读全文
posted @
2025-04-06 15:10
sakura430
阅读(20)
推荐(0)
算法day3 有序数组的平方
摘要:问题描述 思路一:暴力解 通过for循环更新nums数组的值,随后对nums数组采用快速排序,最后将其返回。 代码如下 void quick_sort(vector<int> &a,int low,int high){ if(low>=high){ //边界检查 return ; } int i =
阅读全文
posted @
2025-04-06 16:39
sakura430
阅读(26)
推荐(0)
算法day4 长度最小的子数组|滑动窗口
摘要:题目描述 思路:双指针 对于这样的一个正整数数组,我们可以设置两个指针i,j来控制滑动窗口的长度(即本题中子数组的长度),设置一个sum来计算当前窗口内的元素的和,window_length来记录当前的最小窗口的长度。我们以i作为窗口的起始,j指针在循环中生长。通过循环计算sum的值与target进
阅读全文
posted @
2025-04-06 20:26
sakura430
阅读(28)
推荐(0)
算法day5 螺旋矩阵
摘要:题目描述: 思路: 对于这样的一个旋转矩阵模型,我们在进行赋值的时候,可以盯住每次行坐标不变(纵坐标不变)来进行边界的限制。为了统一,我们在取每一行(列)的区间时采取左闭右开的思想,即每一次行更新(列更新)我们都只计算[begin,end)这样一个范围,这样就可以避免赋值的重复。同时,我们可以设置s
阅读全文
posted @
2025-04-06 14:45
sakura430
阅读(30)
推荐(0)
算法day6 区间和
摘要:题目描述 思路 这道题目求区间和,如果在数据规模很低的情况下,我们可以直接for循环遍历所属区间然后求和返回即可,但是考虑到在大规模数据引入的情况下,如果区间的范围很大,则会有比较差的性能表现,所以我们主要介绍采用前缀和求解的方法。前缀和即随着位置后移不断累加当前即之前位置元素之和得到的对应位置的和
阅读全文
posted @
2025-04-08 20:13
sakura430
阅读(40)
推荐(0)
算法day7 开发商购买土地
摘要:题目描述 思路: 在这道题中,我们的目标是要求得行列中划分部分的最小差值。我们的思路即在赋值的过程中对整个矩阵求和,这样我们便得到了整体的和。随后,我们可以通过for循环实现求纵向与横向的总和。最后,到了关键的一步,我们之前获得了整体的和sum,随后获得了行和与列和,这是我们可以有“总和 - 部分”
阅读全文
posted @
2025-04-09 21:37
sakura430
阅读(39)
推荐(0)
算法day8 移除链表元素
摘要:题目描述 思路一:无虚拟头节点 首先,由于我们是非虚拟头节点解法,我们第一步就应该处理head -> val == val这样的情况,这里我们在设置判断条件时要确保head非空,并且应该采取循环结构,从而应对head更新后依旧val域等于val的情况。处理完head后,我们创建一个临时指针cur,赋
阅读全文
posted @
2025-04-07 22:58
sakura430
阅读(34)
推荐(0)
算法day9 设计链表
摘要:题目描述 思路 整体的思路的话就是增删查三大件,是很常规的一道题。问题在于在leetcode的环境下要自己在类中定义链表结构体。这里比较坑,因为之前的题目基本函数实现所需要的前置条件初始模板都已给出,所以这里可能会让人很疑惑,不知从何下手。由于本题总共涉及到五个函数,所以接下来对链表的初始化以及五个
阅读全文
posted @
2025-04-13 18:09
sakura430
阅读(43)
推荐(0)
算法day10 反转链表
摘要:问题描述 思路一:双指针法 对于要反转的链表,我们为了便于操作,可以设置两个指针:pre以及cur,见词知意,这里的pre指针即是cur的前驱指针(当然,反转过后它就是后驱指针),初始时为nullptr,而cur就是当前指针,初始时为head。这里我们在cur存在的判断条件下循环,在整个过程中,每一
阅读全文
posted @
2025-04-13 20:57
sakura430
阅读(36)
推荐(0)
算法day11 两两交换链表中的节点
摘要:题目描述 思路: 这道题的关键就在于我们在交换两个节点的时候如何正确的保留下一组要处理的节点的位置,不要使链表断开导致丢失陷入死循环或未知情况。处理时我们依旧采用虚拟头节点的操作方式从而统一整个链表的操作流程,这样就可以不用单独考虑头节点的处理情况。在我们首先创建虚拟头节点dummyhead,使其指
阅读全文
posted @
2025-04-15 22:36
sakura430
阅读(29)
推荐(0)
算法day12 删除链表的倒数第N个节点
摘要:题目描述 思路一:算正序位置删除 链表的倒数第N个元素即是正序(len-n+1),(我们这里假设链表的长度为len),所以我们可以将这题的思路由找倒数转表为找正数的位置。接下来的整个操作就与普通的删除链表节点没有什么大差异。 代码如下: ListNode* removeNthFromEnd(List
阅读全文
posted @
2025-04-16 14:19
sakura430
阅读(21)
推荐(0)
算法day13 环形链表
摘要:题目描述 思路:快慢指针 关于检测链表是否有环的问题我们可以将其抽象为一道追击问题。我们设置两个指针,一个快指针,一个慢指针。快指针每一次移动两个步进,慢指针每一次移动一个步进,相当于快指针相对于慢指针每一次移动一个步进,所以快指针一定能够追上慢指针与其相遇。我们假设相遇的位置为meet,环的入口位
阅读全文
posted @
2025-04-18 20:56
sakura430
阅读(26)
推荐(0)
算法day14 有效字母的异位词
摘要:题目描述 思路 我们要判断两个字符串是否为异位词,即是要判断这两个字符串中是否出现了相同的字母且对应了相同的出现次数。这里我们可以采用哈希的想法,即以字符串的字母为“值”来映射位序“键”。由于题目中已经说明字符串只会出现小写字母,所以总共可能出现的字母数为26。我们定义一个长度为26的整型数组has
阅读全文
posted @
2025-04-19 17:59
sakura430
阅读(25)
推荐(0)
算法day15 两个数组的交集
摘要:题目描述 思路一:set 对于交集问题,我们很自然的会考虑到收集元素时的唯一性问题,那么自然也会想到数据结构set,它与数学中集合的概念相同,对于存储的元素去重。所以我们可以使用set,这里为了实现效率,可以选择unordered_set,它是由哈希函数映射实现的,查询效率高。我们先将第一个数组赋给
阅读全文
posted @
2025-04-20 11:09
sakura430
阅读(27)
推荐(0)
算法day16 两数之和
摘要:题目描述 思路一:暴力for循环 我们可以通过两层for循环嵌套,遍历所有的元素,使其求和判断是否与target相等来操作。 代码如下 vector<int> twoSum(vector<int>& nums, int target) { int len = nums.size(); vector<
阅读全文
posted @
2025-04-21 19:48
sakura430
阅读(15)
推荐(0)
算法day17 四数相加
摘要:题目描述 思路:分治+哈希 如果我们采用暴力的解法,则需要嵌套四层for循环,这里我们优化,将四个数组两两分成一组,每次以两层for循环嵌套,我们的目标是要找出a+b+c+d = 0这样的元组的个数,所以在第一组,我们将可能的a+b添加到哈希表中,随后在第二个二层循环里,我们只需判断-(c+d)=
阅读全文
posted @
2025-04-22 14:12
sakura430
阅读(22)
推荐(0)
算法day18 快乐数
摘要:题目描述 思路: 这道题我们试图判断一个数是否符合快乐数的定义。我们可以将其转化为,在判断的n在快乐数算法的演变下转化的数值是否等于1,同时排除掉重复的转化值。那么对于唯一元素的收容的数据结构,我们可以使用集合unordered_set。我们通过在循环中判断sum,并收集sum,最终按照条件的情况返
阅读全文
posted @
2025-04-25 23:17
sakura430
阅读(28)
推荐(0)
算法day19 赎金信
摘要:题目描述 思路: 本题仍然是要判断我们能否在一个串中找到另一个串的元素,并且本体是允许重复的,所以我们第一时间想到哈希解法。我们创建一个哈希表来收集杂志的字符,然后通过判断这些字符是否满足信中所需要的字符的数目。第一次遍历杂志收集,第二次遍历信判断。 代码如下: bool canConstruct(
阅读全文
posted @
2025-04-26 17:28
sakura430
阅读(19)
推荐(0)
算法day20 三数之和
摘要:题目描述 思路:双指针 我们先对nums进行排序,随后设置left与right两个指针跟随for循环遍历的内部迭代。这里的关键就是如何去重。我们在判断时要采取(nums[i]nums[i-1])而非(nums[i]nums[i+1]),因为我们要收集的元组并没有要求内部元素不可以重复,而是要求元组不
阅读全文
posted @
2025-04-27 14:50
sakura430
阅读(31)
推荐(0)
算法day21 四数之和
摘要:题目描述 思路:双指针 四数之和的求解思路本质上与三数之和没什么差别,只不过这一次我们要嵌套两层for循环,而且要注意返回的条件,现在我们的目标是收集四个元素相加和等于target的子数组,所以我们不会再向之前一样固定在第一个加数大于0时返回,而是要考虑的更多。具体的细节可以参考代码。 代码如下:
阅读全文
posted @
2025-04-28 14:19
sakura430
阅读(33)
推荐(0)
算法day22 反转字符串
摘要:题目描述 思路: 原地倒置即是利用一个临时变量temp,这样做到两个元素的交换,整体比较简单,无论奇偶长度,整体只要循环(length/2)次即可。 代码如下: void reverseString(vector<char>& s) { int len = s.size(); char temp;
阅读全文
posted @
2025-04-29 09:12
sakura430
阅读(23)
推荐(0)
算法day23 反转字符2
摘要:题目描述 思路:双指针 对于本题,我们可以先求解出我们能够完整遍历的2k的次数,随后再处理余下的长度不足2k的部分。在处理的过程中,我们将左右指针置于要遍历范围的两侧,使指针向中间移动,通过临时变量来辅助字符的互换。 代码如下: string reverseStr(string s, int k)
阅读全文
posted @
2025-04-30 14:42
sakura430
阅读(24)
推荐(0)
算法day24 反转字符串中的单词
摘要:题目描述 思路一:双指针 采用双指针的思路,既然是要将单词倒置,那我们索性可以设置两个指针在初始时指向串的尾部,在左指针大于等于0的情况下,我们从右侧不断的重复先过滤空字符后采集单词的操作,最后将采集的新的串返回即可。 代码如下: string reverseWords(string s) { ve
阅读全文
posted @
2025-05-01 19:33
sakura430
阅读(30)
推荐(0)
算法day25 右旋字符串
摘要:题目描述 思路:双指针 对于符合题目要求的目标字符串,我们可以拥有一种这样的想法。首先,我们想要使倒数k位前置并且正向的顺序不改变,那么我们可以先整体反转,以abcdefg为例,即可得到gfedcba,此时k值要求为2,那么也即要使当前逆转过的倒序序列的前k项反转回来,即0至k-1反转,随后在将之后
阅读全文
posted @
2025-05-07 21:27
sakura430
阅读(16)
推荐(0)
算法day26 找出字符串中第一个匹配的下标
摘要:题目描述 思路:kmp 这道题要找出字符串中第一个匹配的下标,那么我们首先应该解决的问题是如何正确的识别判断两个字符串之间是否匹配,那么这类问题KMP算法是最为有效的。我们可以通过采取KMP算法求出模式串的next数组,随后遍历主串与模式串进行比对,如果当前的元素不相等,我们就令模式串指针回退到对应
阅读全文
posted @
2025-05-11 10:44
sakura430
阅读(24)
推荐(0)
算法day28 用栈实现队列
摘要:题目描述 思路:双栈 我们知道,队列的规则是先进先出,栈的规则是先进后出,要用栈实现队列的相关操作,我们只需要建立两个栈,一个栈用作输入,一个栈用作输出。当输入时将输入的数据存储在输入栈中,当输出或要查看队列的队首时,我们更新输出栈,然后使用输出栈进行相关的操作。 代码如下 class MyQueu
阅读全文
posted @
2025-05-14 14:06
sakura430
阅读(20)
推荐(0)
算法day29 用队列实现栈
摘要:题目描述 思路:“虚拟循环”队列 关于如何实现用队列模拟栈,这里主要介绍单队列实现的方式。整体的功能和上一道题相似,主要差别在于单队列实现栈的特性主要通过不断的出队列留“栈顶”,再将元素添加回来的方式。 代码如下 class MyStack { public: queue<int> que; MyS
阅读全文
posted @
2025-05-15 14:09
sakura430
阅读(26)
推荐(0)
算法day 30 有效的括号
摘要:题目描述 思路:双栈 对于括号的有效匹配,我们可以采用两个栈来实现。我们首先在输入栈中将整个串的元素入栈,随后由于括号的匹配特性,成对的括号中右括号会后入栈,这样的话我们在入栈完整个串之后,开始将右括号弹出并输入到输出栈,待到输入栈的栈顶均为左括号时开始进行两个栈的栈顶匹配,直至输入栈空,最后根据两
阅读全文
posted @
2025-05-16 14:09
sakura430
阅读(31)
推荐(0)
算法day31 删除字符串中的所有相邻重复项
摘要:题目描述 思路:单栈 对于出现的字符串相邻项除去问题,我们可以通过将整个字符串入栈,然后在入栈的过程中设置一个缓存位ch,ch用来存储栈顶的上一位元素。再每一次压栈后,我们令二者进行比较,若相同,则使当前栈顶及其上一位元素出栈,随后更新ch的值,直至整个字符串长度的循环结束。此时我们再将剩余的元素全
阅读全文
posted @
2025-05-17 09:30
sakura430
阅读(26)
推荐(0)
算法day32 逆波兰表达式求值
摘要:题目描述 思路:栈 人类理解的计算顺序对于计算机而言是无法理解的,由于计算机无法自主识别优先级,所以我们采取逆波兰式使得一个计算表达式可以避免对于括号加优先级的操作,依旧能够保持正确的模式。逆波兰式由此而生。本题我们可以采用栈的方式,在入栈过程中判断当前的字符串是否是运算符,若是运算符,我们就弹出栈
阅读全文
posted @
2025-05-21 15:17
sakura430
阅读(12)
推荐(0)
算法day33 滑动窗口的最大值
摘要:题目描述 思路:单调队列 本题要获得滑动窗口的最大值,我们若是想用双指针暴力解法,在k较大以及数据量较大时会超时,时间复杂度为O(n*k),所以我们应该另寻他法。注意滑动窗口在每一轮循环中会将这一轮的第一个位置的元素抛出,然后在窗口尾部引入一个新的元素。那么我们应该这样考虑,每一轮更新强制性地将上一
阅读全文
posted @
2025-05-24 09:19
sakura430
阅读(32)
推荐(0)
算法day34 前k个高频元素
摘要:题目描述 思路:哈希表+优先级队列 对于这样的一个序列,要统计出现频率前k个的元素,我们自然要利用一种办法来将重复元素的出现次数与这个元素映射起来,而这样的需求正是哈希表的强项所在。所以在一开始,我们可以使用哈希表,通过遍历数组的方式将数组中出现过的数字以及它出现的频率收集起来。接下来要处理的就是如
阅读全文
posted @
2025-05-26 14:36
sakura430
阅读(31)
推荐(0)
算法day35 二叉树的前序遍历、中序遍历、后序遍历(递归方法)
摘要:题目描述 代码实现 public: void traversal(TreeNode *cur , vector<int> &vec){ if(!cur) return; vec.push_back(cur->val); traversal(cur->left,vec); traversal(cur-
阅读全文
posted @
2025-06-04 15:03
sakura430
阅读(23)
推荐(0)
算法day36 二叉树的前中后序的非递归实现
摘要:题目描述 思路:栈 由于前序的序列为根左右,那么我们这里的操作就是先以右子树入栈,随后左子树入栈,这样根据栈的性质,出栈时就能得到左在前,右在后的效果,具体的代码实现如下. class Solution { public: vector<int> preorderTraversal(TreeNode
阅读全文
posted @
2025-06-08 19:07
sakura430
阅读(23)
推荐(0)
算法day37 二叉树的层序遍历
摘要:题目描述 思路:队列 二叉树的层序遍历是二叉树遍历的经典问题,我们在对二叉树进行层序遍历时,队列的使用是非常合适的。我们记录每一层的节点个数,这样当出队时我们就可以知道上一层的节点是否出队完毕,而上一层的节点出队的同时,我们使这个节点的左右孩子加入到队列中,以此循环直到队列为空,将用以收集的二维数组
阅读全文
posted @
2025-06-10 23:05
sakura430
阅读(8)
推荐(0)
算法day38 翻转二叉树
摘要:题目描述 思路:递归 翻转二叉树可采用递归的方式解决,通过不断地遍历每一个节点,对其左右子树进行翻转达到一个二叉树的整体的翻转。但这里要注意的是,遍历的顺序应该采取前序或后序,而非中序,因为中序会导致对当前子树根节点的重复访问从而致使二叉树的翻转失败。具体代码如下。 TreeNode* invert
阅读全文
posted @
2025-06-11 08:49
sakura430
阅读(29)
推荐(0)
算法day39 对称二叉树
摘要:题目描述 思路,递归 判断一棵二叉树是不是对称二叉树,我们可以采取一种递归地方式来解决这个问题。首先,我们应该要判断出多种边界条件下的情况来否定二叉树是对称的,共三种: 1.当前指向的内侧存在而外侧不存在 2.当前指向的外侧存在而内侧不存在 3.当前指向的内外都存在但是二者的节点值并不相同。 由以上
阅读全文
posted @
2025-06-14 08:57
sakura430
阅读(23)
推荐(0)
算法day40 二叉树的最大深度
摘要:题目描述 解法1:递归 我们可以采用递归的方式求解这道题,由于要求解最大深度,我们的策略应该是让由根节点出发的后序遍历(这样的话可以避免对于根节点的二次访问),随后当递归到结尾时返回每一小层次的左右侧深度的比较,通过不断地叠加最后得到最大深度。具体的代码如下。 int maxDepth(TreeNo
阅读全文
posted @
2025-06-16 14:22
sakura430
阅读(28)
推荐(0)
算法day41 二叉树的最小深度
摘要:题目描述 解法1:递归 要求出二叉树的最小深度通过递归方法实际上与求最大深度的方式大差不差,但是在求最小深度时要注意一种情况,即二叉树是单侧树时的的最小深度,根据题干的定义,二叉树的最小深度是根节点至距离其路径最短的叶子节点的距离,但是单侧树的另一侧不存在叶子节点,所以若只是简单的将递归求解最大深度
阅读全文
posted @
2025-06-16 19:46
sakura430
阅读(34)
推荐(0)
算法day41 完全二叉树的节点个数
摘要:题目描述 解法1:普通二叉树解法 完全二叉树它也是二叉树,所以我们可以采用二叉树求总的节点数的通法,采用后序遍历的方式,即可求解。这里采用后序而非前序遍历与中序遍历的原因是因为这两种遍历方式会二次访问根节点,在统计节点时更加复杂。具体的代码如下。 public: int inorderTravers
阅读全文
posted @
2025-06-18 08:44
sakura430
阅读(28)
推荐(0)
算法day42 判断平衡二叉树
摘要:题目描述 解法:递归 二叉树问题大部分离不开递归,本题也一样。对于判断一棵树是否为平衡二叉树,我们要从平衡二叉树的定义的出发。一棵任意一部分子树的左右子树的度的差值的绝对值小于等于1,则它是一棵平衡二叉树。本题我们还是利用后序遍历,这样我们可以由底部向上搜寻获取高度(前序遍历是获得深度的概念),而在
阅读全文
posted @
2025-06-19 17:54
sakura430
阅读(36)
推荐(0)
算法day43 二叉树的所有路径
摘要:题目描述 思路:前序递归+回溯 要搜寻二叉树的所有路径,依然绕不开递归算法,此时要注意的是在判断一条路径是否已经到达终点(即是否搜寻到了叶节点)的过程中,我们应该在判断叶节点之前收集叶节点保存的值,否则会跳过叶节点值的收集,导致漏值。同时,在搜寻到尾部之后,需要不断的回溯回到相对的根节点,方便再次搜
阅读全文
posted @
2025-06-25 09:57
sakura430
阅读(17)
推荐(0)
算法day44 左叶子之和
摘要:题目描述 思路:递归 求解左叶子之和,我们可以采用中序的方式进行递归,过程中我们只采集左叶子的值,其它的部分只是访问但不收集,整体代码如下。 void traversal(TreeNode *cur,int & res){ if(cur == nullptr) return; if(cur -> l
阅读全文
posted @
2025-06-27 09:33
sakura430
阅读(20)
推荐(0)
算法day45 找树左下角的值
摘要:题目描述 解法一:递归 寻找树的最底层以及最左侧的节点,我们应该关注的实际上是两个点:第一,最底层,也即我们应该要能够维护深度,这样才能确保取得最底层的节点;第二,最左侧,也即最底层的最先出现的节点,所以我们在遍历时只需要更新每一层遇到的第一个节点。具体的代码如下。 void traversal(T
阅读全文
posted @
2025-07-14 09:27
sakura430
阅读(11)
推荐(0)