- 博客(23)
- 收藏
- 关注
原创 DAY14之二叉树理论基础及递归遍历和迭代遍历
分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点。那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了处理顺序和访问顺序是不一致的。// 中 traversal(cur->left, vec);
2024-02-07 19:02:53
925
原创 DAY11之有效的括号、删除字符串中的所有相邻重复项和逆波兰表达式求值
由于栈结构的特殊性,非常适合做对称匹配类的题目。首先要弄清楚,字符串里的括号不匹配有几种情况。一些同学,在面试中看到这种题目上来就开始写代码,然后就越写越乱。建议在写代码之前要分析好有哪几种不匹配的情况,如果不在动手之前分析好,写出的代码也会有很多问题。先来分析一下 这里有三种不匹配的情况,我们的代码只要覆盖了这三种不匹配的情况,就不会出问题,可以看出 动手之前分析好题目的重要性。
2024-02-04 11:31:11
888
原创 DAY10用栈实现队列与用队列实现栈
就是用栈来实现队列的先进先出功能,我们知道,栈是先进后出的,要实现队列的先进先出功能,避免不了要使用两个栈,一个用于输入(成为入栈),一个用于输出(成为出栈),下面用图来表现一下二者的功能代码实现如下。
2024-02-02 12:17:06
248
转载 DAY10之栈与队列基础
我这里讲的都是C++ 语言中的情况, 使用其他语言的同学也要思考栈与队列的底层实现问题, 不要对数据结构的使用浅尝辄止,而要深挖其内部原理,才能夯实基础。从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。C++标准库是有多个版本的,要知道我们使用的STL是哪个版本,才能知道对应的栈和队列的实现原理。
2024-02-02 12:14:00
55
原创 DAY9之重复的子字符串
步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同。步骤三: 因为 这是相等的前缀和后缀,t[2] 与 k[2]相同 ,t[3]与k[3] 相同,所以,s[2]一定和s[4]相同,s[3]一定和s[5]相同,即:s[2]s[3] 与 s[4]s[5]相同。= -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。
2024-02-01 15:43:50
1257
1
原创 KMP算法+代码实现
解决的问题:字符串匹配的问题文本串:aabaabaaf模式串:aabaaf要解决的问题是文本串种是否有模式串暴力解法: 前缀表前缀:不包括尾字母,包含首字母的所有子串后缀:不包括首字母,包含尾字母的所有子串因为前缀表要求的就是相同前后缀的长度。而最长公共前后缀里面的“公共”,更像是说前缀和后缀公共的长度。这其实并不是前缀表所需要的。所以字符串a的最长相等前后缀为0。 字符串aa的最长相等前后缀为1。 字符串aaa的最长相等前后缀为2。 等等.....。这就是前缀表,那为啥就能告诉我们 上
2024-02-01 15:41:00
1099
1
原创 DAY8之反转字符串(|和||),替换数字,反转字符串中的单词和右旋字符串
reverse函数参数reverse(起始迭代器,末尾迭代器);翻转字符串中自起始迭代器指向的字符到末尾迭代器指向的字符例如:s="abc";注意reverse是左闭右开s.end()是指向s最后一个字符后面的迭代器。则s变为"cba";
2024-01-31 13:43:21
338
原创 从心始缘|北大学长的别样高中
高二嘛,分班后,一开始延续了高一的状态,真的很不错,考的好的时候甚至能超第二名20多分,但是上学期的期中考试,我直接掉到了第五,也就是从那次开始,我的状态不知怎么的再也回不去了,我也经历了这辈子持续最长的一段时间的失眠(大概有七八个月),当时因为失眠的事情找了老师好几次,寝室也多次调整,现在想起来还怪对不起我的舍友嘞,无数漫长的夜晚,我辗转难眠,无数漆黑的宿舍,我凝视着天花板上模糊的光影,听着室友平稳的呼吸声和呼噜声(呼噜声晓昂的,这必须吐槽一下啊),心中涌动着明日课业的忧虑和对未来的迷茫。
2024-01-30 15:07:36
1087
1
原创 DAY7之四数相加和赎金信
就是先用一个map存储nums1和nums2中的两数之和,再两重for循环nums3和nums4,利用map找到答案。利用哈希函数中的map,然后再结合以前讲过的两数之和,将复杂度降低到O(n^2)本人就是想巩固一下set,结果复杂度飙升到O(n^2);暴力解很显然是四重for循环,此处不再赘述。至于set的用法,在前面的哈希基础是有的。也是纯自研,复杂度降为O(n)纯自研(遥遥领先的复杂度)时间复杂度是O(n^4)
2024-01-30 15:00:52
298
1
原创 DAY6之哈希基础
首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。哈希表是根据关键码的值而直接进行访问的数据结构。这么这官方的解释可能有点懵,其实直白来讲其实数组就是一张哈希表。哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在这所学校里。
2024-01-29 12:31:54
989
原创 周末总结:数组和链表
二分法(数组是升序或降序的,下以升序为例)应该是,确定一个左边界和有边界,取中间位置的值与target进行比较,而不是左右边界直接向内缩小,如果中间位置的值比target小,则让left=middle,反之,则让right=middle也就是不断成倍地缩小区间,从而加快寻找速度核心代码为或者。
2024-01-27 22:49:19
259
原创 DAY4之环形链表||
那么相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。先拿n为1的情况来举例,意味着fast指针在环形里转了一圈之后,就遇到了 slow指针了。这个公式说明什么呢?
2024-01-27 14:29:01
379
原创 DAY4之反转链表
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。接下来就是交换相邻两个元素了,此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序。好吧,卡哥思路和我差不多,只不过换一种形式而已,但是卡哥的解释更为全面,我就放在下面了。看到这道题自然联想到双指针的做法,因为需要改变链表的方向,自然牵扯到双指针。对应的C++代码实现如下: (注释中详细和如上图中的三步做对应)针对特殊情况,我会在代码中给出详细解释。这道题目正常模拟就可以了。
2024-01-27 14:24:29
449
原创 DAY3之链表的基础知识
链表的定义需要用结构体(struct)手写int val;//节点上存储的元素//指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数//这就是一个构造函数,用于构造节点对这个ListNode(int x) : val(x), next(NULL) {} 的解释ListNode(int x) : val(x), next(NULL) 是 ListNode 结构体的构造函数,用来创建 ListNode 对象的实例。
2024-01-26 22:18:49
609
1
原创 DAY2:有序数组的平方、长度最小的子数组和螺旋矩阵||(附带二维数组回形遍历)
本人第一印象是一个二维数组回形遍历的变形,也就是一个顺时针的遍历吧,而且比普通回形遍历简单一些,因为是个正方形嘛,在这里就直接给出代码了哈。在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
2024-01-26 17:41:13
3028
1
原创 DAY1:数组的二分查找和移除元素
二分法(数组是升序或降序的,下以升序为例)应该是,确定一个左边界和有边界,取中间位置的值与target进行比较,而不是左右边界直接向内缩小,如果中间位置的值比target小,则让left=middle,反之,则让right=middle。erase函数是删除vector中的某个元素,时间复杂度是O(n);这一块之前写过,所以凭感觉写的不错(笑死我,写的都不是二分法)以上纯属暴力做法,虽然比纯暴力复杂度少了一半,但是不如二分法。fast寻找新数组中需要的元素,新数组的下标就是slow。其实也就(左闭右开)
2024-01-26 17:33:53
2439
1
原创 迭代器以及哈希基础
distance(p, q):计算两个迭代器之间的距离,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等。a.count(x)//发挥集合中等于x的元素个数,时间复杂度O(k+logn),其中k为元素x的个数。a.find(x)//在集合a中查找等于x的元素,并返回指向该指针的迭代器。当所查找的关键key出现时,它返回数据所在对象的位置,如果沒有,返回iter与end函数的值相同。//*i 就是迭代器i指向的元素。// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置。
2024-01-15 21:39:33
878
1
原创 解数独(leetcode编号37)
k++){public:刚开始我是按着回溯的正规思路做的,没有用bool类型,一直运行出错,后来了解到了这种做法,虽然还是很暴力,起码能过,本人第一次写博客,望多多指教。
2023-12-16 16:28:33
73
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人