- 博客(14)
- 收藏
- 关注
原创 day 17 110.平衡二叉树;257. 二叉树的所有路径;404.左叶子之和
使用一个动态数组path来记录从根节点到叶子节点中所有节点的值。解题:本题使用后序遍历,为的是将左右节点高度的最大值返回给其父节点,一旦左右节点的高度差大于1,则全局变量res=false。本题单层递归逻辑为:如果当前节点的左节点不为空,左节点的左右节点为空时,意味着该左节点就是题目要找的左叶子节点。因此需要将值记录下来。单层递归逻辑为:先求左节点高度,再求右节点高度,如果左右节点高度差大于1,则全局变量res=false,二叉树不平衡,如果左右节点高度差小于1,则将左右节点中较大的节点高度返回给父节点。
2023-07-15 14:28:00
49
1
原创 day16 104.二叉树的最大深度;111.二叉树的最小深度;222.完全二叉树的节点个数
二叉数最小深度时的单层递归逻辑为:先求左节点深度,再求右节点深度,如果左节点为空,右节点不为空,则返回右节点深度,如果左节点不为空,右节点为空,则返回左节点深度,如果左右节点均不会空,则返回深度较小的那个值。二叉树最大深度时的单层递归逻辑为:先求左节点深度,再求右节点深度,返回左右节点较大的深度给父节点。解题:最大深度可以使用后序遍历,返回值为int类型,递归函数返回左右节点的最大深度给其父节点。因此由于单层递归逻辑的不同,求最小深度很容易陷入求最大深度的误区中。解题:和求最大深度类似,但有坑。
2023-07-15 13:22:20
54
1
原创 day 15 二叉树层序遍历;226.翻转二叉树;101. 对称二叉树
如果val相等,则返回分别告诉自己的父节点左(右)为true,当父节点的左右节点都告诉其为true时,则当前左右子树的父节点的子节点对称。它和后序遍历不一样,前序遍历是自顶向下,而后序遍历是自下而上。解题:由于本题考察的是二叉树左右子树是否对称,因此就要判断左右子树对应的节点数值是否要相等。注意要定义一个size变量来记录二叉树中每层入队列的节点个数,并且注意当节点的左右节点入队列时,要把当前节点pop出队列。解题:注意到如果使用前序遍历,当每个节点的左右节点依次翻转时,整个二叉树就可以实现整体翻转。
2023-07-15 13:08:46
50
1
原创 day13 239. 滑动窗口最大值;347.前 K 个高频元素(不懂大小顶堆的定义)
2.Myqueue中push函数在插入val前就对队列做了一定的排序。3.Myqueue中的pop函数用来删除队列中的队首元素。1.选择deque双端队列容器来构建单调队列。需要学习的地方:如何构建一个单调队列?
2023-07-10 10:58:37
51
1
原创 day11 20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值
1.由于我们采用的是栈结构,因此是后面将要进来的括号来匹配栈顶已经存入的括号。所以本质上是右括号来匹配左括号,因此如果栈顶中的括号是右括号,则肯定不匹配!同样,map中key值应该为右括号,value值应该为对应的左括号。解题思路:由于栈结构是后进先出,因此非常适合做匹配类的题目,由此想到了用stack为基底来解答题目。又因为要匹配括号是否正确,因此想到了用哈希表中的map结构来进行括号的匹配。当stack中没有元素时,cur.top()是在访问一个空的栈,程序会出错误。并且两个判断条件的左右顺序不能变!
2023-07-08 21:11:27
38
原创 day10 #232.用栈实现队列;225. 用队列实现栈
由于队列可以直接返回末尾元素即queue.back(),因此想到设置两个队列que和tmp,其中que用来pop或者top元素,tmp则暂时存储que中前(size-1)个元素。每次pop中,在返回cur之前,需要将tmp暂存的元素重新赋值给que,即que=tmp,然后再将tmp内部元素清空。当要模拟队列先进先出时,如果出栈stout内部为空,则让进栈stin中的元素依次进入出栈stout。若原本stout内部元素不为空,stin中后进入的元素会插在stout出栈中的头部,而不是尾部!
2023-07-07 11:11:30
41
1
原创 day8 344.反转字符串;541. 反转字符串II;剑指Offer 05.替换空格;151.翻转字符串里的单词;剑指Offer58-II.左旋转字符串
解题:注意本题不要使用库函数reverse;
2023-07-05 20:28:57
48
1
原创 day7 第454题.四数相加II;383. 赎金信;第15题. 三数之和;第18题. 四数之和
由于要判断有多少组合元素为0,意味着不仅要判断四个数组的值为0,还要判断为0的组合个数。然后再用一个双层循环判断另外两个数组的元素组合是否为-c-d(a+b+c+d==0,-c-d==a+b)。第二:为什么while(nums[left]==nums[left+1]&&left<right)会数组越界,而while(left<right&&nums[left]==nums[left+1])不会呢?解题:排序+双指针+去重,超级无敌难,着重注意去重的方法!第一:为什么要nums[i]==nums[i-1]?
2023-07-04 17:02:43
38
原创 day 6 242.有效的字母异位词;349. 两个数组的交集;202. 快乐数;1. 两数之和
当nums1中的元素出现时,arr中下标为nums1[i]的值就设为1.然后用另一个循环来判断下标为nums2[i]的arr数组的值是否为1,如果为1则说明两数组中均存在nums2[i]这个值。由于可能出现重复的nums2[i]这个值,因此需要用一个unordered_set res来存储值(unordered_set res中存储的值是没有重复元素的),最后由于要返回一个vector 类型的变量,因此需要将unordered_set转换为vector。
2023-07-03 11:49:52
68
1
原创 day4 24两两交换链表中的节点;19.删除链表的倒数第N个节点;160.链表相交;142.环形链表2
24.两两交换链表中的节点解题:解决链表多指针问题时,一定要画出链表结构图,本题运用了四个指针来分别cur,tmp,tmp1,temp。注意循环结束条件,画图来判断何时可以结束循环。如果链表改变头节点,最好使用一个虚拟头节点dummyhead来指向原头节点head。链表遍历节点的时候,注意使用临时节点cur来代替head在链表中遍历。
2023-07-01 17:35:59
38
原创 day3 ,203移除链表元素 707设计链表 206翻转链表
细节部分一定要注意,所有节点的下标都从0开始,因此比如链表中只有1个节点,那么index=0时指的就是这个节点,但此时size=1.所以,当插入节点时,如果index=0,则相当于在原头节点前插入一个节点,当index==size时,相当于在原链表末尾处加了一个节点。插入节点的时候一定要注意设置一个临时节点来保存插入节点位置的后序节点。个人心得:但凡设计到删除链表中某一个节点时,需要注意删除的节点是否可能为头节点,如果不用虚拟头节点进行操作就会让代码冗余,需要写两种情况,1是删除的节点不是头节点;
2023-06-30 14:10:37
52
原创 day2 977,209,59
没思路的原因有以下几点:第一,对于vector类型的变量理解不到位,其实可以把他看成一个二维数组,res[i][j]中,i代表行,j代表列。的方法,滑动窗口说白了也是由两个指针构成的,慢指针代表窗口的起始,快指针代表窗口的结束。当两个指针间的窗口内容满足要求时,快指针前进,慢指针不变,当窗口内容不满足要求时,慢指针前进,然后继续判断快慢指针间的内容是否符合要求,若不符合则慢指针继续前进直至窗口内容符合要求时。解题心得:运用了双指针的思想,不过本题并非是快慢双指针而是。
2023-06-29 13:13:36
174
1
原创 day1 二分法+双指针法(双指针比较基础没写博客)
个人心得:使用了左闭右开的二分法来查找目标值的第一个元素(左闭右闭同样可以),由于是左闭右开的二分法,当循环条件终止时,left一定和right相等,且是目标值target的下标,因此函数getBorder返回left或right都可以。个人心得:由于x的平方根肯定存在于[1,x]左闭右闭区间中,因此可以想到用二分法来查找目标值,值得注意的一点是,mid*mid可能超出INT_MAX,因此使用long long基础类型来存储mid*mid的值。个人心得:就是69题的翻版,本质是一样的。
2023-06-28 13:50:09
59
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人