自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 代码随想录C++ Day14 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

前序递归遍历或者后序递归遍历都是可以的,因为无论一开始就交换左右孩子,还是最后交换左右孩子,都可以。这道题目我们也可以使用迭代法,但要注意,这里的迭代法可不是前中后序的迭代写法,因为本题的本质是判断两个树是否是相互翻转的,其实已经不是所谓二叉树遍历的前中后序的关系了。细心的话,其实可以发现,这个迭代法,其实是把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较,那么其实使用栈也是可以的。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。

2024-07-04 22:09:43 991

原创 代码随想录C++ Day13 | 二叉树递归遍历,迭代遍历,统一迭代,层序遍历

对于前序遍历,入栈的顺序变成了右,左,中,nullptr(nullptr的位置为什么总是在“中”后面,因为“中”是我们要处理的对象,遍历的分类也是根据中间节点被遍历到的顺序)分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,层序遍历的思想很简单,就是每一层的元素,从左往右依次出队,同时呢,一个元素出队时,将他下层的左右节点入队,这样下层的节点也都是按照从左往右的顺序入队的。

2024-07-04 16:44:15 981

原创 代码随想录C++ Day12 | 150.逆波兰表达式求值 239.滑动窗口最大值 347.前 K 个高频元素(347待完成)

可以用队列来储存窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。其实,大家可以自己观察一下单调队列的实现,nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 O(n)。再来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。

2024-07-02 23:34:58 902

转载 代码随想录C++ Day11 | 232.用栈实现队列 225.用队列实现栈 20.有效的括号 1047.删除字符串中的所有相邻重复项

由于栈是“先进后出”,而队列是“先进先出”,所以至少需要两个栈来实现队列,一个作为输入栈,在push的时候,元素进入输入栈,当要pop时,注意,要将最先入栈的那个元素弹出,这时候就需要另外一个栈,称为输出栈,将输入栈的所有元素一个个pop出来,并push进输出栈,这个时候,元素的顺序就反过来了。此时再将输出栈的栈顶元素弹出。从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。刚刚讲过栈的特性,对应的队列的情况是一样的。

2024-07-01 23:25:54 38

原创 代码随想录C++ Day8 | 151.翻转字符串里的单词 55.右旋字符串 28. 找出字符串中第一个匹配项的下标

假设模式字符串里,在冲突发生位置之前的部分是abcde,这部分确认是可以和主字符串相应位置匹配的,于是可以确定主字符串这部分内容也是abcde,那么将匹配开始位置后移一位,前边的部分就是要确认主字符串中的bcde和模式字符串abcd是否相同,也就是要确认模式字符串里的abcd和bcde是否相同。那么,KMP算法的思想就是,将这个重复的过程利用起来,提前计算出来若当前字符冲突了,将开始匹配位置右移,也就是模式字符串右移几位,才可以确保移动之后,在冲突位置之前的部分是可以匹配的上。这里的右移几次,又叫做。

2024-06-30 23:01:56 944

原创 代码随想录C++ Day7 | 344.反转字符串 541.反转字符串II 54. 替换数字(第八期模拟笔试)

最直接的方法是创建一个同样大小的数组,从后往前将原数组的所有元素填入。但本题要求空间复杂度O(1),因此必须在原数组上进行操作。本题使用双指针法,i指向新长度的末尾,j指向旧长度的末尾。从后往前修改也不用担心i未遍历到的数字被j指针内容覆盖。这道题只不过就是比上一道多了一些判断条件,因此只需要将这些条件写出来就行,交换的函数可以直接用库函数。但这么写不够优雅,下边这样写更简洁,可以将情况1,2归为一类,这里自己实现reverse函数。

2024-06-30 10:41:59 295

原创 代码随想录C++ Day6 | 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

454.四数相加II从四个长度都为n的数组中各挑一个元素,求满足四数之和为0的下标四元组有几个。暴力法是遍历四个数组,时间复杂度为O(n^4)过高。将四个数之和分解为两个 两数之和,就可以借鉴5.两数之和的思想,区别在于,本题要求返回的是满足条件的下标四元组个数,所以建立的unordered_map的value要定义为两数之和出现的次数,而不是下标;

2024-06-28 13:38:40 642

原创 代码随想录C++ Day5 | 242.有效的字母异位词 349. 两个数组的交集 202.快乐树 1.两数之和

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。”, 最简单的就是,嵌套两个for循环,将整数数组nums的两两元素之和逐个算出来,与目标值作对比,相等就返回两个循环变量的当前值,由于元素不能和自己相加,所以要排除,两个循环变量相等的情况。不要小瞧这个耗时,在数据量大的情况,差距是很明显的。

2024-06-26 22:22:04 829

原创 代码随想录C++ Day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

nullptr,保证至少有两个节点,节点数为奇数时,最后一个节点自然就剩了下来,不用交换。设置快慢指针,快指针一步走两个节点,慢指针一步走一个节点,快指针相对慢指针的速度是一个节点,因此慢指针入环之后,快指针不会跨过慢指针,因此快指针最多转两圈(慢指针最多转一圈)两者就相遇了。具体查看代码随想录思路详解。双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。

2024-06-25 23:32:59 696

原创 代码随想录C++ Day3 | 203.移除链表元素 707.设计链表 206.反转链表

cur指针负责遍历链表,将遍历到的节点的next赋值为前一个节点,也就是pre指针指向的节点。由于cur的next的指向已经被修改了,遍历无法继续,于是还需要一个temp指针,提前保存cur->next的值(纠正:动画应该是先移动pre,在移动cur)直观来说,重新创建一个空链表,然后再将原链表的每个节点依次插入到新建链表的头节点,时间和空间复杂度都是O(n)// 链表变为 1->2->3。// 现在,链表变为 1->3。,请你反转链表,并返回反转后的链表。是指向下一个节点的指针/引用。

2024-06-25 00:20:31 678

原创 代码随想录C++ Day2 | LeetCode977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

这一题的关键是理解和分解螺旋,首先,螺旋可以分为一个个完整的圈(注意如果n是奇数,则最后一个圈只有一个格子),每一圈的左上角格子都是(0,0), (1,1),(2,2)...;将指针i, j之间的区域视为滑动窗口,指针j负责将滑动窗口右扩,滑动窗口变大,累加和增加,直到累加和满足条件时,再控制指针i依次右移,滑动窗口变小,累加和变小,一直到累加和不满足条件就停止右移。输入:target = 11, nums = [1,1,1,1,1,1,1,1]解释:平方后,数组变为 [16,1,0,9,100]

2024-06-23 14:02:01 989

原创 代码随想录C++ Day1 | LeetCode704.二分查找,21.移除元素

试想当right=left+2,也就是左右指针和middle指针指向的位置为三个连续的元素,若此时若nums[middle]>target,而令right=middle-1=left,此时跳出循环,返回-1,而num[left]==target是有可能的,这种情况就被漏掉了,这就是right为什么更新为middle而不是middle-1的原因。输入: nums = [-1,0,3,5,9,12], target = 9。输入: nums = [-1,0,3,5,9,12], target = 2。

2024-06-22 01:14:20 1041

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除