- 博客(26)
- 收藏
- 关注
原创 力扣17电话号码的字母组合(c++)
力扣题目链接阅读完本题题目要求后,要解决如下3个问题1、数字和字母如何映射2、两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来3、输入1 * #按键等等异常情况可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组,代码如下:回溯法来解决n个for循环的问题回溯三部曲:1、确定回溯函数参数首先需要一个字符串s来收集叶子节点的结果,然后用一个字符串数组result保存起来,这两个变量定义为全局变量
2022-11-28 09:40:59 335
原创 力扣77组合(c++)
从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2][1,3] [1,4],以此类推。可以看出这个棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。函数里一定有两个参数,既然是集合n里面取k的数,那么n和k是两个int型的参数。
2022-11-21 10:18:43 346
原创 力扣450删除二叉搜索树中的节点(c++)
递归三部曲1、确定递归函数参数以及返回值说到递归函数的返回值,这里我们可以通过递归返回值删除节点。2、确定终止条件遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了3、确定单层递归的逻辑这里就把二叉搜索树中删除节点遇到的情况都搞清楚。有以下五种情况:第一种情况:没找到删除的节点,遍历到空节点直接返回了后面4种情况都是找到了删除的节点第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点。
2022-11-19 14:54:32 212
原创 力扣701二叉搜索树中的插入操作(c++)
例如插入元素10 ,需要找到末尾节点插入便可,一样的道理来插入元素15,插入元素0,插入元素6,需要调整二叉树的结构么?终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。我们不需要遍历整棵树,搜索树是有方向的,可以根据插入元素的数值,决定递归方向。这里把添加的节点返回给上一层,就完成了父子节点的赋值操作了,详细再往下看。可以有,也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的。有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作。
2022-11-14 20:47:24 313
原创 力扣501二叉搜索树中的众数(c++)
首先如果不是二叉搜索树的话,应该怎么解题,是二叉搜索树,又应该如何解题,两种方式做一个比较,可以加深对二叉树的理解。如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。此时又有问题了,因为要求最大频率的元素集合(注意是集合,不是一个元素,可以有多个众数),如果是数组上大家一般怎么办?遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。既然是搜索树,它中序遍历就是有序的。
2022-11-07 10:17:00 236
原创 力扣236二叉树的最近公共祖先(c++)
1、求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从低向上的遍历方式。2、在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。3、要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。本题没有给出迭代法,因为迭代法不适合模拟回溯的过程。理解递归的解法就够了。
2022-11-03 20:44:06 706
原创 力扣617合并二叉树(C++)
因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了啊(如果t2也为NULL也无所谓,合并之后就是NULL)。单层递归的逻辑就比较好些了,这里我们用重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。本题使用前中后序遍历都是可以的,遍历两棵树其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。t1 的右子树:是 合并 t1右子树 t2右子树之后的右子树。最终t1就是合并之后的根节点。
2022-10-31 09:44:47 193
原创 ARM中断控制系统 按键驱动程序设计
程序不断地查询设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用查询的方式不断检测温度变化。特点:实现简单;但CPU利用率很低,不适合多任务的系统。
2022-10-27 18:18:03 171
原创 力扣654最大二叉树(C++)
题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。这表示一个数组大小是1的时候,构造了一个新的节点,并返回。参数就是传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。1.先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。确定单层递归的逻辑,这里有三步工作。
2022-10-23 19:38:19 281
原创 力扣513找树左下角的值(C++)
可以使用前序遍历(中序,后序都可以,因为本题没有中间节点的处理逻辑,只需要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。本题还需要类里的两个全局变量,maxLen用来记录最大深度,result记录最大深度最左节点的数值。如果使用递归法判断最后一行,最后一行的结点一定是深度最大的。当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。3.确定单层递归的逻辑。
2022-10-20 20:19:44 202
原创 力扣111二叉树的最小深度(c++)
那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,而且这个最小距离,也同样是最小深度。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)本题还有一个误区,注意题目中说:最小深度是从根节点到最近叶子节点的最短路径上的节点数量,注意是叶子节点。二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)参数为要传入的二叉树根节点,返回的是int类型的深度。3.确定单层递归的逻辑。
2022-10-16 18:55:33 453
原创 力扣101对称二叉树(C++)
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
2022-10-14 20:17:33 207
原创 力扣347前 K 个高频元素(C++)
为什么不用快排呢, 使用快排要将map转换为vector的结构,然后对整个数组进行排序, 而这种场景下,我们其实只需要维护k个有序的序列就可以了,所以使用优先级队列是最优的。如果使用大小为k的大顶堆,在每次移动更新大顶堆的时候,每次弹出都把最大的元素弹出去了,那么保留下来的就是个低频的元素了。所以我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。首先统计元素出现的频率,这一类的问题可以使用map来进行统计。
2022-10-10 08:29:14 191
原创 力扣239滑动窗口最大值(C++)
如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。这样就保持了队列里的数值是单调从大到小的了。每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。先考虑暴力方法,就是遍历一遍的过程中每次从窗口中找到最大的数值,这样很明显是O(n × k)的算法。查询当前队列里的最大值,直接返回队列前端也就是front就可以了。当然没有现成的这样队列的数据结构,于是需要我们自己去实现。再que.push(滑动窗口添加元素的数值),
2022-10-06 21:02:10 148
原创 力扣150逆波兰表达式求值(C++)
弹出的两个栈顶元素运算的时候是有先后顺序的,如num1先弹出,num2后弹出,那么减法运算就是num2-num1。声明的栈的类型是long型,因为力扣里的测试数据比较大,int型会发生溢出现象,使编译无法通过。其实逆波兰表达式相当于是二叉树中的后序遍历,但我们没有必要从二叉树的角度去解决这个问题。③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①。题目明显是让我们求后缀表达式,可以用栈来解决。②若扫描到操作数则压入栈,并回到①,否则执行③。
2022-10-02 22:55:15 845
原创 力扣225用队列实现栈(C++)
计算出size为队列的长度。我们可以让队列的头部元素删除并添加到队列尾部,这样循环size-1次时,原先队列的尾部元素就变成了新队列的头部元素,我们让这个元素出队,就相当于出栈。4、boolean empty() 如果栈是空的,返回 true;返回队列的尾部元素,也就返回栈顶元素。把元素从队尾插入队列中即可,相当于入栈。其实这道题目只用一个队列就够了。
2022-09-29 23:39:11 237
原创 力扣剑指offer 58 左旋转字符串(c++)
为了让本题更有意义,提升一下本题难度:不能申请额外空间,只能在本串上操作。只能在本串上操作,我们可以通过局部反转+整体反转 达到左旋转的目的。最后就可以得到左旋n的目的,而不用定义新的字符串,完全在本串上操作。例如 输入:字符串abcdefg,n=2。反转区间为n到末尾的子串"bagfedc"反转区间为前2的子串为"bacdefg"反转整个字符串为"cdefgab"2.反转区间为n到末尾的子串。1.反转区间为前n的子串。
2022-09-26 10:29:49 278
原创 力扣151反转字符串里的单词(c++)
移除空格我们采用双指针法去做,最后再resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。如果我们将整个字符串都反转一下,那么整个字符串的顺序就是倒序了,但单词本身也会是倒序,再把各个单词反转一下。举个例子,源字符串为:" learn the algorithm well "按照力扣原题的进阶要求来书写代码,即不使用辅助空间,空间复杂度要求为O(1)。单词反转:" well algorithm the learn "不使用辅助空间,我们可以在原字符串上下功夫。
2022-09-23 12:40:17 526
原创 力扣383赎金信(c++)
为什么要用数组做哈希表?在本题的情况下,使用map的空间消耗要比数组大一些,因为map要维护红黑树或者哈希表,而且还要做哈希函数,会费一些时间!数据量大的话就能体现出来差别了。所以数组更加简单直接有效!题目说只有小写字母,那么可以采用空间换取时间的哈希策略, 用一个长度为26的数组来记录magazine里字母出现的次数。然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。暴力解法就是两层for循环,不断去寻找,这里不做过多解释,下面来看哈希解法。
2022-09-18 22:03:55 342
原创 力扣454四数相加Ⅱ(c++)
在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。首先定义 一个unordered_map,key准备存放a和b两数之和,value 准备存放a和b两数之和出现的次数。四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况。遍历大A和大B数组,统计两个数组元素之和放到key中,和的出现的次数放到value中。
2022-09-16 00:28:29 312
原创 力扣242有效的字母异位词(C++)
这道题目中字符串只有小写字符,那么就可以定义一个数组record,大小为26,来记录字符串s里字符出现的次数,因为字符a到字符z的ASCII也是26个连续的数值。需要把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。要检查字符串t中是否出现了这些字符,可以在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。时间复杂度是为O(n),空间复杂度为O(1).时间复杂度为O(n^2)。
2022-09-12 01:32:52 510
原创 力扣160链表相交(c++版)
如果两个链表相交,又都不存在环,那么不难想象这两个链表共同构成了一个Y型,相交部分全部都相同,两链表交点处指针相等。此时我们就可以比较指针A和指针B是否相同,如果不相同,俩指针同时向后移动1个next,如果相同,则找到交点。声明指针A指向链表A的头结点,指针B指向链表B的头结点。我们求出两个链表的长度,并求出两个链表长度的差值gap。让两个链表末尾对齐,指向长链表的指针移动gap个位置。否则循环退出返回空指针。时间复杂度度O(n+m)
2022-09-10 11:22:24 629
原创 力扣977有序数组的平方(c++版)
链接: 力扣题目链接首先要理解题目里的非递减顺序是什么意思。非递减顺序排列即是指:意思是关键字递增序排列,但是并非单调递增(因为有重复的关键字)从小到大或者允许中间有相等的情形。比如:5 4 4 3 2 1暴力排序现将每个数进行平方,再进行排序。不做过多解释。注意vector包含在头文件中,sort() 函数位于头文件中。这个时间复杂度是 O(n + nlogn)数组因为存在负数,所以负数平方后可能大于正数。该数组平方后是数组的两边值大,两边往中间数值会减少的顺序。最大值只能出现在数组的两端
2022-09-05 08:46:12 579
原创 轻松获奖五一数学建模和蓝桥杯
文章目录 前言 大赛简介 大赛经历 经验心得 前言这里我介绍一下大学期间两个可以轻而易举获奖的竞赛,都是我大一参加并且获奖的。五一数学建模经历:基本没怎么接受过培训和学习。和另外两个团队成员一起获得了2021年第十八届五一数学建模三等奖。蓝桥杯经历:拥有一点编程语言知识。获得过2021年第十二届蓝桥杯省赛三等奖。大赛简介五一数学建模:比赛时间是每年的五月一号,报名费用为50元。奖项设置:一等奖:5%二等奖:15%三等奖:25%优秀奖:55%蓝桥
2022-05-26 18:57:44 4275 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人