每日一题
文章平均质量分 68
关于C语言/C++及数据结构的题目,及参考代码
Forward♞
这个作者很懒,什么都没留下…
展开
-
分治法——找众数
要利用分治法找众数,首先就先要使数组有序。这里,我们用C语言库中的。语句没有执行,那就说明。就是最大的,那就需要和。注:本题已通过牛客网。原创 2023-11-05 20:56:38 · 1183 阅读 · 0 评论 -
每日一题——寻找右区间(排序 + 二分查找)
最简单的思想,就是利用两层循环来求得答案。第一层循环用来遍历每个区间数组。同时,题目告诉我们对于每一个区间数组。题目要我们找的,就是对于每一个区间数组。,但显然,这个方法的时间复杂度为O(N。,第二层循环用来找到每一个。,以此来优化我们的查找。),效率低,故不做讨论。原创 2023-09-28 21:56:08 · 181 阅读 · 0 评论 -
每日一题——下一个排列
当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。交换,以能够让当前排列变大,从而得到下一个排列。我们需要将一个左边的。原创 2023-09-01 18:32:09 · 256 阅读 · 2 评论 -
每日一题——旋转图像
就被覆盖了,因此我们需要创建一个临时变量来保存数据。,然后再将新数组的数据覆盖到原数组就可以了。因此,当n为奇数或者偶数时,区域的。,这样,这个旋转过程就变为了。原创 2023-08-30 20:30:32 · 304 阅读 · 0 评论 -
每日一题——柱状图中最大的矩形
要计算出每个柱形的最大矩形,也就是要将栈中的每个下标都出栈,而要确保每个下标都可以出栈,那就要保证进栈下标代表的高度要小于栈中元素对应的高度,因此我们。下标为4高度为2的柱形仍低于下标为2高度为5的柱形,因此下标为2高度为5的柱形确定的最大矩形也就知道了。下标为4高度为2的柱形高于下标为1高度为1的柱形,因此这两个柱形仍不能确定其最大的矩形,继续遍历。第五个高度为2,小于下标为3的高度,因此下标为3高度为6的柱形确定的最大矩形就知道了。第六个的高度为3,由同样的分析,高度为。第四个高度为6,同样,高度为。原创 2023-08-28 13:26:39 · 82 阅读 · 0 评论 -
每日一题——排序链表(递归 + 迭代)
注:本体的解法建立在的基础之上,如果对这一排序还不太了解,建议看看:👉👉👉既然采用递归排序来解决这道题,那么我们就要采用分治的思想分治法(Divide and Conquer)是一种解决问题的算法设计策略,它将一个大的问题分解为若干个小的子问题,逐步解决这些子问题,并将它们的解合并成一个大问题的解。原创 2023-08-22 21:25:37 · 91 阅读 · 0 评论 -
每日一题——接雨水(单调栈)
我们常说的**”积水成洼“**,指的就是说:当两边地势高于中间的地势时,中间的区域就成了洼地,也就可以积水了。我们已经知道要用非递增的单调栈来解决这个问题,那么接下来就要讨论如何做具体的实现了。,我们保证栈中的数据是非递增的,这样当一个数据准备进栈时,如果出栈顶元素后栈不为空,那么栈顶元素的前一个元素。这一题就是如此,我们需要通过一个栈来记录数据,如果出栈顶元素后栈为空,那么直接将进栈元素。的条件,即形成了积水区域。接下来,我们以题目中的例子。,栈顶元素的前一个为。构成容器的数组元素的。原创 2023-08-19 16:57:26 · 172 阅读 · 0 评论 -
每日一题——移动零
同样大小的空间,将遍历数组,将非零元素从头放置,将零从后往前放置,这样就可以将所有的零放到后面,同时保证非零元素的相对顺序。如果可以开辟额外的空间,那这题十分好做。但是这一题要求我们不能额外开辟空间,即要求我们的。,那我们就要思考用双指针的方法了。原创 2023-08-16 14:48:54 · 62 阅读 · 0 评论 -
每日一题——圆圈中最后剩下的数字(约瑟夫环问题)
因此我们应该将。原创 2023-08-14 19:41:16 · 240 阅读 · 0 评论 -
每日一题——旋转数组的最小数字(II)
注:此题是昨天的拓展延伸,昨天题目数组的条件是不会存在重复元素,而本题数组的元素可以重复,因此建议先做前面一题,进行思考,这样求解这一题的过程就会容易理解许多。原创 2023-08-13 21:42:16 · 267 阅读 · 1 评论 -
每日一题——寻找旋转排序数组中的最小值(I)
情况一:旋转过后数组变成。举个例子,经过旋转后它。而这两种情况都有一个。以数组**最右边的值。原创 2023-08-12 22:15:51 · 262 阅读 · 0 评论 -
每日一题——滑动窗口的最大值
每当窗口向右滑动一个元素,就会有一个新的元素入队。在这个元素入队之前,由于我们要确保队列的单调递减性,因此当。需要注意:当窗口向右滑动时,最大值下标会离开窗口,永远不会在进入窗口,因此在窗口滑动的过程中,我们要。我们可以用一个队列来存储这些还没有被移除的元素的下标,同时确保从队头到队尾,这些。就要通过循环删除这些不会对结果造成影响的元素,最后再把这个元素的下标插入队列。注:这种解法建立在单调队列的基础之上,而单调队列是双端队列的特殊形式,如果对。由于我们要求的是滑动窗口的最大值,那我们不妨先做一个。原创 2023-08-11 17:09:54 · 193 阅读 · 0 评论 -
每日一题——复杂链表的复制
虽然我们也可以不对原链表进行还原,但。原创 2023-08-06 08:00:00 · 153 阅读 · 0 评论 -
每日一题——回文链表
回文结构即字符串正序逆序完全一致,如“1 2 3 4 3 2 1”,那么我们就要想办法同时比较链表头和链表尾的元素,看其是否相等。原创 2023-08-05 14:31:42 · 134 阅读 · 0 评论 -
每日一题——反转单链表
利用三个指针变量进行反转。注1:循环结束的条件为。原创 2023-08-05 11:01:54 · 129 阅读 · 0 评论 -
每日一题——只出现一次的数字(II)
注:本题的解法建立在位运算之上,如果对位运算不太了解,建议先看看👉。原创 2023-07-31 15:00:00 · 197 阅读 · 1 评论 -
每日一题——只出现一次的数字(III)
那么问题又来了,我们怎么确保分组时相同的元素在一组,只出现一次的两个元素不在一组呢?就拿上面的例子来说,所有数字异或到一起后结果为。原创 2023-07-31 09:44:46 · 190 阅读 · 0 评论 -
每日一题——丢失的数字
不能用异或法,这是因为**《找到消失的数字》数组中的数据可以重复,这就导致了消失的数字就不止一个,而用异或只能确定一个数字,**因此异或法就行不通了。后,也觉得这题也可以用同样的方法,通过改变对应下标的元素来找到丢失的数字。这一题,我们同样利用异或的特性解决问题。可能又有小伙伴回想为什么。由于数组元素范围都在。的一个数,那么我们就。原创 2023-07-30 12:14:23 · 97 阅读 · 0 评论 -
每日一题——只出现一次的数字
注:如果对位运算符还不太了解,建议先看看👉。原创 2023-07-30 11:37:02 · 599 阅读 · 0 评论 -
每日一题——删除有序数组中的重复项
注:本题所采用的方法是建立在的基础之上的,如果大家对双指针的方法不大了解,或者不会做《移除元素》这一题,建议先去看看👉。原创 2023-07-29 15:00:00 · 263 阅读 · 0 评论 -
每日一题——找到消失的数字
如果可以使用额外空间,那这题就好办了。我们直接创建一个相同大小的数组,数组的每个位置代表。的每个元素,然后遍历数组计数就行。原创 2023-07-29 09:48:22 · 264 阅读 · 0 评论 -
每日一题——除自身以外数组的乘积
以下我们以先在。原创 2023-07-27 17:26:26 · 307 阅读 · 0 评论 -
每日一题——多数元素
就这样各路军阀一直以这种以一敌一同归于尽的方式厮杀下去,直到少数阵营都死光,那么最后剩下的几个必然属于多数阵营。(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)假设有100个士兵,由于多数元素必然大于n/2,那我们假设多数元素士兵为51个,其他元素士兵为49个,这100个士兵一起去占领一块高地(来实现,时间复杂度为O(NlongN),效率有所提高,但仍无法满足题目要求。这样,只需要遍历一遍数组,就可以得到想要的结果,时间复杂度为O(N)这一题也一样,数组的第一个元素就是第一个士兵,,原创 2023-07-26 23:00:39 · 164 阅读 · 0 评论 -
每日一题——地下迷宫(迷宫问题II)
这题是在昨天迷宫问题——I的基础上进行的变形,因此,如果昨天的题目没看或者对迷宫问题不怎么了解,建议先看看昨天的解析。int row;int col;} POS;int top;} ST;ST STACK;//定义一个全局栈 //初始化栈 void StackInit(ST * stack) {} //判断栈空 bool StackEmpty(ST * stack) {} //入栈 void StackPush(ST * stack , POS val) {原创 2023-07-22 20:53:23 · 137 阅读 · 0 评论 -
每日一题——迷宫问题(I)
这样写会造成一个问题:经过调试我们可以发现,这个函数并没有实现走到右下角(出口)便结束的功能,这个函数结束时,停留的位置会在出口处(因为可以走的的地方全部被标记为-1,当无路可走的时候就会回溯,最后就会回到出口),因此,为了得到正序(入口->出口)的路径,我们可以建立一个辅助栈,先将原有栈的数据逐个出栈到辅助栈中,再打印辅助栈的数据,这样就可以做到正序打印路径了。由于栈的“先入后出”的特性,取出栈的数据只能从栈顶到栈底取,因此如果我们直接对栈的数据进行打印,那么这个路径就是倒序(出口->入口)的。原创 2023-07-21 19:40:00 · 60 阅读 · 0 评论 -
每日一题——重复的子字符串
注:本题的题解基本建立在KMP算法之上,对KMP算法不太了解的小伙伴可以参考这篇文章。原创 2023-06-01 15:01:25 · 616 阅读 · 1 评论 -
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
返回值:此值由将输入字符作为数字解析而生成。如果该输入无法转换为该类型的值,则atoi的返回值为 0。这篇博文多有参考,如果读者想对这个库函数有更深的了解,可以去看看大佬写的博客。缺陷分析:我们可以看到,tips:本篇对库函数。str即传入的字符串。原创 2023-05-31 23:21:13 · 719 阅读 · 1 评论 -
每日一题——删除字符串中的所有相邻重复项
那么,我们怎么保存遍历字符的前面一个元素呢?称为进栈/压栈/入栈,其位置在。栈:是一种特殊的线性表,其。称为出栈,其位置也在。原创 2023-05-29 17:35:12 · 733 阅读 · 2 评论 -
每日一题——用两个队列实现栈
【代码】每日一题——用两个队列实现栈。原创 2023-05-26 21:14:01 · 1067 阅读 · 1 评论 -
每日一题——四数之和(双指针解法)
*原创 2023-05-25 21:26:06 · 636 阅读 · 1 评论 -
每日一题——三数之和(双指针)
当我们执行left++,right- -操作的时候,如果nums[left] == nums[++left],或nums[right] == nums[- -right],那么显然也会出现重复的情况,因此。假设给定的数组为{-1,-1,2},如果我们用if(nums[i] == nums[i + 1])进行判断 ,那么第一个-1就会被跳过,这个三元组就不会被计入到结果集中,显然这是不合理的。那么我们是要判断nums[i] == nums[i + 1]还是判断nums[i] == nums[i - 1]呢?原创 2023-05-24 13:31:31 · 1200 阅读 · 2 评论 -
每日一题——两数之和(返回下标和返回数值两种情况)
第一层for循环用来遍历整个数组,第二层for循环用来判断遍历的两个数的和是否等于target。),如果采用哈希表,可以将时间复杂度降到O(n),但由于笔者还未对哈希表展开学习,故不做讨论。当然我们同样可以上面的暴力解法来解决问题,但有没有效率更高的方法呢?,因此,我们最开始就要用排序算法来使数组nuns有序。注:本题只采用暴力解法,时间复杂度为O(n。我们直接用两层for循环来解决问题。我们可以采用双指针的方法。原创 2023-05-23 22:59:16 · 488 阅读 · 1 评论 -
每日一题——找出字符串中第一个匹配项的下标(实现strStr)
tips:这道题如果用暴力解法,其时间复杂度为O(M * N),其实正确的解法应该是KMP算法,这样可以将时间复杂度降为O(N),但由于KMP算法较难理解,笔者还未完全悟透,故以后再和大家分享KMP算法,和本题如何用KMP算法求解。接着就开始将字符串needle和字符串haystack开始匹配,直至遍历完字符串haystack。首先计算字符串haystack和字符串needle的长度。原创 2023-05-07 23:08:12 · 309 阅读 · 1 评论 -
每日一题——左旋转的字符串
对字符串前n个字符进行反转,再对余下的字符反转。先写一个反转字符串指定区域的函数。最后对整个字符串反转。原创 2023-05-06 12:42:35 · 116 阅读 · 1 评论 -
每日一题——反转字符串中的单词
当然,最容易想到的还是暴力解法,即碰到字符串串首空格(字符串开头就是空格)和单词之间的重复空格,就不断将字符串的元素前移,直至覆盖多余空格,但可想而知,这样做的效率不高。接下来就是要考虑题目最恼火的限制条件:不允许多余空格的出现,即只允许单词之间出现一个空格,多余的空格须全部删除。中讲过,只不过上一次我们处理的是数组,而这一次处理的时字符串(实际上字符串也是数组)我们首先不考虑太多限制因素,先看如何实现字符串中单词的反转。其实比较好的做法其实我们已经在。原创 2023-05-05 19:44:03 · 503 阅读 · 0 评论 -
每日一题——替换空格
不额外消耗内存,也就是说我们在填充空格之前就要直到填充后数组的大小,这个好办,我们可以先遍历原数组,记录空格的总个数count,那么填充后数组的大小就是: 原数组的大小 + count * 2。在方法一中定义新字符串数组时,static修饰符必须加上,否则系统会提示错误,这涉及到栈帧的知识,笔者目前还在学习中,其中原理还未摸透,故以后再和大家分享。如果我们跟方法一一样从前往后遍历字符串,碰到空格就填入“%20”,那么我们就要不断移动后面的所有元素,可想而知,这样的时间复杂度为O(n。原创 2023-05-04 21:10:37 · 59 阅读 · 0 评论 -
每日一题——反转字符串—II
想必大家对字符串的反转已经熟悉了,那么这一题我们思考的主要是如何确定字符串反转的区间,也就是说如何做到每隔2k个字符就反转前k个字符,难道要用计数器来统计2k和它的前k个字符吗?这样做当然可以做出来,但显然效率不高。看完上面的例子,就差不多能明白题目要我们做什么了,做了。我们先来举几个例子来理解题目意思。原创 2023-05-02 15:33:19 · 703 阅读 · 0 评论 -
每日一题——反转字符串—I
【代码】每日一题——反转字符串—I。原创 2023-05-01 14:49:31 · 89 阅读 · 0 评论 -
每日一题——两两交换链表中的节点
定义指针cur = head,prev = newHead(即cur的前一个节点),当cur和cur->next不为空时进行循环。每次循环都定义一个temp = cur->next,对cur,temp,prev三个指针进行操作,从而实现节点的交换。新建一个表头newHead指向原来的表头head。如图展示的就是交换第一组节点的过程。最后返回新头结点的next即可。原创 2023-04-30 12:34:47 · 56 阅读 · 0 评论 -
每日一题——设计双向链表
题目所给函数传递的是一级指针,因此我们就要使用带哨兵位的双向链表。原创 2023-04-29 13:52:47 · 69 阅读 · 0 评论