数据结构与算法
文章平均质量分 60
以实战为线索,介绍一些常见的算法
生生不息~
程序员一枚
展开
-
力扣225. 用队列实现栈【附进阶版】
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的!所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。原创 2023-12-18 20:50:50 · 629 阅读 · 0 评论 -
力扣59. 螺旋矩阵 II
这道题依然要坚持循环不变量原则(二分法也是这样的!原创 2023-12-18 20:41:10 · 557 阅读 · 0 评论 -
【基础算法】试除法判定质数(优化)
注意这里的一个总要优化是for循环的终止条件是i原创 2023-12-17 22:47:13 · 502 阅读 · 0 评论 -
【基础算法】前缀和
数组: a[1], a[2], a[3], a[4], a[5], …, a[n]前缀和 Si为数组的前 i项和前缀和: S[i] = a[1] + a[2] + a[3] + … + a[i]注意: 前缀和的下标建议要从 1开始, 避免进行下标的转换s[0] = 0前缀和的解题思路其实都是先得到相应的和s,然后根据公式求得对应的前缀和,公式一定要理解,不能死记硬背!一/二维前缀和模板总结如下:一维前缀和二维前缀和S[i, j] = 第i行j列格子左上部分所有元素的和。原创 2023-12-17 22:31:20 · 473 阅读 · 0 评论 -
二叉树的层序遍历模板
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。原创 2023-12-10 16:52:11 · 420 阅读 · 0 评论 -
二叉树前中后序遍历——(非)递归写法
二叉树遍历也分为两种广度优先遍历(Breadth-first order):尽可能先访问距离根最近的节点,也称为层序遍历深度优先遍历(Depth-first order):对于二叉树,可以进一步分成三种(要深入到叶子节点)pre-order 前序遍历,对于每一棵子树,先访问该节点,然后是左子树,最后是右子树in-order 中序遍历,对于每一棵子树,先访问左子树,然后是该节点,最后是右子树post-order 后序遍历,对于每一棵子树,先访问左子树,然后是右子树,最后是该节点。原创 2023-12-10 13:12:59 · 1065 阅读 · 0 评论 -
力扣541.反转字符串 II
这道题目其实就是模拟,实现题目中规定的反转规则就可以了。但是在思考过程中,走了一些弯路,也就是为了处理逻辑我尝试这样做过:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。但是其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。所以当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。原创 2023-12-07 15:13:25 · 530 阅读 · 0 评论 -
力扣66. 加一
让我看看有多少人是想着是通过先把原数组转换为一个数,加1后在转成数组!这样是不行的,会溢出,开long long也不够!事实上,最终我们只需要对数组 digits 进行一次逆序遍历,找出第一个不为 9 的元素,将其加一并将后续所有元素置零即可。如果 digits中所有的元素均为 999,我们需要返回一个新的数组即可。以上就可以涵盖了所有的情况了。原创 2023-12-03 00:35:51 · 395 阅读 · 0 评论 -
力扣225.用队列实现栈
使用两个队列queue来实现。为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中 queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。入栈操作时,首先将元素入队到queue2,然后将queue1的全部元素依次出队并入队到queue2,此比时queue2的前端的元素即为新入栈的元素,再将queue1和queue2互换,则queue1的元素即为栈内的元素,queue1的前端和后端分别对应栈顶和栈底。原创 2023-12-02 00:01:36 · 466 阅读 · 0 评论 -
力扣232.用栈实现队列
将一个栈当作输入栈,用于压入 push传入的数据;另一个栈当作输出栈,用于 pop 和 peek操作。每次 pop 或 peek时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。这里具体实现用的是双端队列Deque表示栈的嗷,效率更高科普一个小tips,Deque中的D就是double,e表示edge,所以是双端队列。原创 2023-12-02 00:01:10 · 533 阅读 · 0 评论 -
力扣142. 环形链表 II
很多如果只涉及链表中值val规律的,例如判断是否是回文链表、是否有环以及找到环链表尾节点指向的链表索引位置等等,都可以通过哈希表方便的做出来。原创 2023-11-29 00:07:45 · 478 阅读 · 0 评论 -
力扣141.环形链表
由于循环条件一定是判断快慢指针是否重合,如果我们将两个指针初始都置于 head,那么 while 循环就不会执行。因此,我们可以假想一个在 head 之前的虚拟节点,慢指针从虚拟节点移动一步到达 head,快指针从虚拟节点移动两步到达 head.next,这样我们就可以使用 while 循环了。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。否则,返回 false。原创 2023-11-29 00:07:30 · 419 阅读 · 0 评论 -
力扣19. 删除链表的倒数第 N 个结点
1、凡是可能涉及到头节点删除操作的(此题便是),都统一设置哨兵节点。这道题的dummy就是。2、链表找倒数第k个节点思想:创建两个指针,第一个指针查询链表中结点的个数count,然后count-k确定删除结点的位置,用第二个指针遍历链表到count-n-1个位置。原创 2023-11-28 08:47:39 · 335 阅读 · 0 评论 -
力扣70. 爬楼梯
这道题很显然属于斐波那契数列的一个变体,所以第一想法是使用递归去做。于是很容易得到公式f(n)=f(n-1)+f(n-2) f(1)=1 f(2)=2,是一个多路递归。但是如果单纯递归这道题会超时,所以还需要加上一个备忘录,通过map将之前出现的值存储一下,这个也就是递归优化-记忆法。原创 2023-11-28 08:47:13 · 377 阅读 · 0 评论 -
【经验总结】LeetCode中链表类题目经验总结十条
链表是以节点(node)存储的链式存储结构,一个node包含一个data域(存放数据)和一个next域(存放下一个node的指针),链表的各个节点不一定是连续的,它可以分为带头结点和不带头结点。头结点仅包含next域。在这篇文章中,主要讲解使用链表的小技巧,如何使用这些技巧来解题,并且列举LeetCode中具有代表性的链表题目,这篇文章非常适合已经刷过一定数量链表类题目的uu观看,看完有助于巩固总结做链表这类题目的经验技巧。原创 2023-11-26 11:56:55 · 923 阅读 · 3 评论 -
力扣203. 移除链表元素
从我目前的立场看,链表的题目,但凡涉及删除节点这个操作(这个操作可能作为单独的考点,也可以作为复杂题目的一小步)的题目,都统一设置虚拟化头节点会很方便,因为这样原链表的所有节点就都可以按照统一的方式进行移除了。原创 2023-10-27 17:52:00 · 56 阅读 · 1 评论 -
C++常见的STL用法(机试向)
作为计算机相关专业的学生,无论是就业、考研复试、保研,机试都是一个很常见且重要的考核。其中一般OJ平台上C++、java是最常见的两种主流使用语言,考虑到性能运行速度的问题,我是主要使用C++作为主语言,下面结合自己平时刷acwing、PTA、蓝桥、力扣等平台程序设计算法题的一些经验,对C++中常见的STL 用法做一个大致的总结。本人小白,如果有问题欢迎大佬们批评指正!原创 2022-11-02 16:31:26 · 988 阅读 · 1 评论