算法学习笔记
文章平均质量分 91
喝哈喝哈
这个作者很懒,什么都没留下…
展开
-
DAY17 平衡二叉树&二叉树所有路径&左叶子之和
1.求二叉树深度 和 二叉树高度的差异,求深度适合用前序遍历,而求高度适合用后序遍历。2.迭代法没太理解: 通过栈模拟的后序遍历找每一个节点的高度?3.递归法:对于空节点返回0;对于高度差超过1返回-1;否则就返回当前节点的最大高度。最后判断返回根节点的值是-1,还是最大高度,进行判断true或false。1.**可以感受出来,如果把作为函数参数就是可以的,因为并没有改变path的数值,执行完递归函数之后,path依然是之前的数值(相当于回溯了)**在第一个版本中,函数参数我就使用了引用,即。原创 2024-04-03 11:49:57 · 798 阅读 · 0 评论 -
DAY16 二叉树最大深度&最小深度&完全二叉树节点个数
1.使用前序(中左右),这样是从上往下,就是深度的概念。2.也可以使用后序遍历(左右中),这样就是从下往上,就是高度的概念。使用前序求的就是深度,使用后序求的是高度。递归法始终不是很会,层序遍历容易理解点。1.什么是最小深度?什么是叶子节点?根节点到叶子节点的最短距离。左右子节点都为空的节点就是叶子节点。2.后序遍历,左右中,就是从下往上,求的是高度,每次把结果返回给父节点, 最大高度 = 最大深度。前序遍历,中左右,就是从上往下,求的是深度。1.又熟悉了完全二叉树、满二叉树的定义。原创 2024-03-30 16:14:24 · 970 阅读 · 0 评论 -
DAY 15补 对称二叉树
1.如何同时遍历两个二叉树?在迭代法,添加左右节点的左、右节点进一个队列、栈、或数组中存储,每次成对取出来判断。2.对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,其实要比较的是两个树(即根节点的左右子树)原创 2024-03-19 01:01:38 · 843 阅读 · 0 评论 -
DAY 15 二叉树层序遍历 & 翻转二叉树
1.用size记录每层的节点数量,因为queue中会包含上下层的节点,通过size记录的值可以确定队列弹出的元素是属于同一层的。2.返回的是一个二维数组。每一层的节点都用一个数组来存储,这层遍历完了后再添加进二维数组中。3.每次访问某一层的节点时,都会将节点的左右孩子添加进队列(若不为空)。4.二叉树中,广度优先搜索的数据结构用队列;深度优先优先搜索的数据结构用队列。二叉树的层序遍历,就是图论中的广度优先搜索在二叉树中的应用,需要借助队列来实现(此时又发现队列的一个应用了)。原创 2024-03-15 00:21:55 · 636 阅读 · 1 评论 -
DAY14二叉树迭代遍历
1.前序遍历中访问节点(遍历节点)和处理节点(将元素放进result数组中)可以同步处理,但是中序就无法做到同步!2.迭代的时候,包括了遍历、处理两个步骤,遍历就是在访问元素;处理就是添加进返回的数组result数组中。3.用栈来做存储节点的数据结构,先进后出,每次添加进result数组时,都是栈顶元素,然后pop()。原创 2024-03-13 00:42:55 · 387 阅读 · 0 评论 -
DAY 12滑动串口最大值【单调队列】 & 前K个高频元素【优先级队列】
1.用i - k来确定移动窗口最左边的元素。2.MultiSet、set都是有序的,所以插入元素时会自动排序,然后通过rbegin()返回最大的元素值。3.底层都是deque双端队列实现的,可以在头部和尾部进行插入和删除操作;deque是可以两边扩展的,而且deque里元素并不是严格的连续分布的。通过和分别在尾部和头部插入元素。通过size()函数获取deque的大小,通过front()和back()函数获取头部和尾部元素。使用pop_back()和分别删除尾部和头部元素。最后,通过。原创 2024-03-06 17:16:02 · 982 阅读 · 0 评论 -
DAY 11有效括号& 删除字符串中的相邻重复项 & 逆波兰表达式
1.括号匹配是使用栈解决的经典问题。由于栈结构的特殊性,非常适合做对称匹配类的题目。匹配问题都是栈的强项2.在入栈的时候就进行了判断应该入的是括号右边的哪个符号:“}” “]” “)”;方便后面做比较。1.string字符串的尾部添加、删除元素操作2.没思路,但看了后又比较简单。最初想用双指针来做,就比较复杂。class Solution {//双指针// 直接用fast指针覆盖slow指针的值// 遇到前后相同值的,就跳过,即slow指针后退一步,下次循环就可以直接被覆盖掉了。原创 2024-03-05 15:12:44 · 851 阅读 · 0 评论 -
DAY 10 用栈实现队列 && 用队列实现栈
1.STL中,C++中的stack、queue 是容器么?不是,而是归类为容器适配器。二者能由其他容器实现底层结构2.stack、queue 都不提供迭代器,不允许有遍历行为。3.stack、queue 都默认用deque实现底层结构。4.std::deque(双端队列)是一个动态数组,允许在两端进行高效地插入和删除操作。std::deque允许在队列的两端进行插入和删除操作。这意味着在队列的前端和后端都可以快速地插入和删除元素,使得它比更适合需要频繁在两端进行操作的情况。std::deque。原创 2024-03-04 12:53:05 · 808 阅读 · 1 评论 -
DAY9 实现strSTR()&& 重复子字符串
说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMPnext数组就是一个前缀表(prefix table)前缀表有什么作用呢?前缀表里,统计了各个位置为终点字符串的最长相同前后缀的长度。前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。原创 2024-03-04 09:49:26 · 532 阅读 · 1 评论 -
DAY8 反转字符串&反转字符串II&替换数字&翻转字符串里的单词&右旋字符串
1.库函数不是考察点时可以使用2.swap()的两种实现:1.中间变量 2. 位运算^=是异或赋值运算符,它将左操作数与右操作数进行异或运算,并将结果赋值给左操作数。1.通过 i + k 与 size()进行比较,看看剩余元素是否比k 大或小;2.熟悉reverse();C++库函数以左闭右开原则;而swap()是交换两个元素。每次遍历,i += (2 * k);1.通过来判断字符串里是否有数字2.通过来改变字符串大小3.先预先给数组扩容带填充后的大小,然后在从后向前进行操作赋值【双指针】。原创 2024-03-01 08:48:44 · 1039 阅读 · 1 评论 -
DAY7 四数相加&赎金信&三数之和&四数之和
1.map[a + b]++ 会将 map 中键为 a + b 的值增加1。如果该键不存在,则会先插入一个新的键值对,再将值设为1。2.auto是一个 C++11 引入的关键字,用于自动推断变量的类型。这里iter的类型会自动推断为合适的迭代器类型,用于遍历的键值对。3.:两两数组之和,简化为两数之和。//a+b的次数基础之上++;1.没有什么思路,看完题解后理解的不够深入。2.对于a的去重操作很细节,判断后面与判断前面之分,逻辑效果不同。不能有重复的三元组,但三元组内的元素是可以重复!原创 2024-02-28 10:19:26 · 987 阅读 · 1 评论 -
DAY5 有效的字母异位词&两个数组的交集&快乐数&两数之和
1.当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。2.map 是一个key value 的数据结构,map中,对key是有限制,对value没有限制的,因为key的存储方式使用红黑树实现的。原创 2024-02-26 20:27:41 · 935 阅读 · 1 评论 -
DAY4两两交换链表中的节点&删除链表的倒数第N个节点&链表相交&环形链表II
1.倒数第几个问题,应用双指针思想,就像移动固定的一段长度。1.将**短的链表和长的链表从尾端对齐**,因为如果两个链表从某个点开始相交,则表示后面的一整串都相交,那么尾端对齐后再比较前一个节点的next指向是否一致就行了。和 swap (curA, curB);来处理B>A的情况。而不用写两次遍历比较。默认A>B的情况。lengthA 没被显式地初始化为0;1.快慢指针相对速度为1个单位,类似追及问题;2.以一个单位的速度差,快慢指针必定会在环内相遇。原创 2024-02-25 21:58:27 · 1267 阅读 · 1 评论 -
DAY3 移除链表元素&涉及链表&反转链表
1.学习单链表定义、创建连续链表、遍历链表基本操作2.需要一个中间变量来依次判断并更新中间变量,来遍历链表【用头节点遍历的话,最后返回的已经不是真正的头节点了】;并且要判断curr.next是否为null;3.关于释放内存的操作有点模糊。delete tmp;//这段代码首先将头节点保存在临时变量tmp中,然后将头指针head指向下一个节点,最后使用delete释放临时变量tmp指向的节点的内存。删除链表的头节点之后,应该检查head是否为nullptr,以确保链表是否为空。原创 2024-02-23 22:37:11 · 1131 阅读 · 1 评论 -
DAY2 有序数组平方&长度最小数组&螺旋矩阵
1.从两端的入手比较大小,意味着比较的时候是从较大的值开始比较2.比较后,将较大值从大到小的顺序给到新数组3.else中就包含了等于的情况1.外层为向右扩展的大循环,那for循环就代表终止位置,内循环是缩小窗口的,就代表起始位置;2.内循环缩小窗口时,需要用while进行循环判断;3.窗口缩小后要更新sum,且起始位置+1;原创 2024-02-22 13:59:29 · 1589 阅读 · 1 评论 -
DAY1 二分查找&移除元素
根据定义区间,确定循环不变量规则。然后在左右区间中,更新left与right。根据4种情况,利用middle和right的值作为返回值,根据区间定义不同,判断right是否+1;原创 2024-02-21 14:03:23 · 2127 阅读 · 0 评论 -
关于螺旋矩阵||
给定一个正整数 `n`,生成一个包含 1 到 `n^2` 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]原创 2024-01-19 09:49:09 · 385 阅读 · 1 评论 -
关于有序数组平方
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。原创 2024-01-02 23:08:03 · 365 阅读 · 0 评论