自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第17天||● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

这题其实就是去判断每颗子树的高度差,去遍历根节点的每一颗子树,如果有左右子树高度差超过1的情况,直接返回-1。没有超过-1则返回高度,最后判断递归返回值是否为-1,如果是-1则说明不是平衡二叉树。这个题用到了回溯的知识,周日还得好好看一下。这题要搞清楚说明是左叶子之后就很简单了。

2023-11-10 18:56:32 131 1

原创 代码随想录算法训练营第16天||● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

和求二叉树的最大深度方法类似。求二叉树的最大深度方法是计算一个max,这个就是计算一个min。但是需要考虑到左子树为空,右子树不为空。右子树为空,左子树不为空的情况。但是我们有很多叶子节点,因为求的是最大深度,所以我们需要返回的是最大的高度。我们可以先遍历到叶子节点,然后从叶子节点一层一层往上遍历,每遍历一次,将高度高度+1。本题用递归的话,是要用到后续遍历的思路。也就是求根节点的最大高度。对于这种N叉树,我们可以用层序遍历去求解,也就是广度优先搜索。递归法实现,昨天实现了用迭代法求二叉树的最大深度。

2023-11-09 17:11:07 121 1

原创 代码随想录算法训练营第15天||● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

如果题目不要求输出二维数组的话,可以直接通过将根节点先加入队列,然后写一个while循环,先将队头元素出队,然后记录队头元素,然后将队头元素的左孩子和右孩子都加入队列中,直到队列中没有元素,停止循环。来记录每层中的最大值。这题需要记录每一层的孩子个数,所以我们不能一个while循环用到底,而是需要用一个整数size来记录每层节点的个数,然后再while循环中再写一个while循环,循环次数为该层节点的个数。这题其实也不难,还是用层序遍历的方法,加一个条件,就是位置指针指向的节点左右孩子都为空则是最小深度。

2023-11-08 21:15:10 132 1

原创 代码随想录算法训练营第14天||二叉树的● 理论基础● 递归遍历 ● 迭代遍历

2.完全二叉树:满足两个条件:(1)除了最后一层,其他各层组成的树为满二叉树(2)最后一层节点从左到右排列。4.平衡二叉搜索树:树的左右子树高度差绝对值不超过1的二叉搜索树,同时左右子树都是平衡二叉搜索树。3.二叉搜索树:满足左子树的值小于根节点,右子树的值大于根节点的二叉树。1.满二叉树:节点个数为2^K -1 的二叉树,K为树的高度。先访问树的根,然后访问数的左节点最后访问树的右节点。先访问树的左节点,然后访问树的根最后访问树的右节点。先访问树的左节点,然后访问树的右节点最后访问树的根。

2023-11-07 19:56:03 100 1

原创 代码随想录算法训练营第13天||● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

大概思路就是,我们创建一个大小为k的小根堆优先队列,然后往优先队列中加入元素的频率,当加入的元素大于k时,优先队列弹出值,此时弹出的值是从最小值开始弹出。如果需要入队的元素大于队列中的尾部元素,我们就需要将尾部元素弹出,直到要入队的元素小于或等于尾部元素,此时将该元素插入插入队尾。我们可以构建一个单调队列,去维护每次滑动窗口中的最大值,也就是将每次滑动窗口中的最大值放在队列的头部,这样的话我们得到每次滑动窗口的最大值就只需要在每次滑动窗口的时候,将队列中的头部插入结果数组即可。解法二:队列中存入数组下标。

2023-11-06 19:23:51 98

原创 代码随想录算法训练营第11天||● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值

需要注意的是,由于栈是先进后出,所以为了我们的最后返回的结果正确,我们可以在将元素加入字符串栈的时候直接加入到字符串尾部(这样可以保证字符串的顺序,比如说对于abbaca,我们先在栈中尾插加入a,然后在尾插加入b此时字符串就是ab),然后在弹出字符串栈中元素的时候,我们直接弹出尾部元素(由于栈是先进后出,要模拟栈的话,我们必须弹出尾部元素,就比如上边的ab,我们得弹出元素b)。总的来说就是,我们遍历字符串,先将首字符加入栈中然,后将字符串中的元素和栈顶元素比较,如果相同就弹出元素,如果不同就加入栈中。

2023-11-05 19:58:32 106 1

原创 代码随想录算法训练营第10天||栈和队列的理论基础、232.用栈实现队列● 225. 用队列实现栈

所以我们要使用队列模拟栈,就必须在出队的时候将最后一个元素出队,所以我们可以借助两个队列,一个队列用来存放入栈的元素,另一个队列作为中转站存放出队时最后一个元素的前面所有元素,在模拟出栈操作的时候将,队列中除最后一个元素的所有元素都放入另一个队列中,然后将最后一个元素出队即可。如果队列想弹出一个元素,我们必须要先判断出栈中有没有元素,如果出栈中有元素我们就将出栈中的元素弹出,如果出栈中没有元素,我们就将入栈中的元素都放入出栈中然后再弹出。用栈的基本函数去模拟队列,需要主要的是,模拟队列的出队操作。

2023-11-04 14:29:53 88 1

原创 代码随想录算法训练营第九天||●28. 实现 strStr()●459.重复的子字符串●字符串总结 ●双指针回顾

想想双指针法,想想可不可以局部反转和整体反转,然后遇到字符串匹配问题的时候看看能不能使用KMP算法。然后在从新的字符串中去查找老字符串,如果能查找到,说明有子串可以重复构成该字符串。这题目可以用KMP来解,也可以用一种非常有趣的方法来解。因为本题是检查一个字符串是否可以由自己的子串重复构成,那我们可以直接。将这个字符串复制一遍,然后放在自己的后面,将首字符和尾字符删除了。花了半天画了个图,KMP代码倒是记住了,但是还有有些地方没理解。双指针的方式非常多。快慢指针,左右指针,多思考。被KMP算法折磨了。

2023-11-02 19:50:19 250 1

原创 代码随想录算法训练营第八天||● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符串

首先就是如何将多余的空格去除,对于去除字符串中的字符(不管是空格还是别的),我们都可以参考前面数组移除元素的做法。但是这个题目因为不是去除所有的空格而是去除多余空格,所以我们需要控制空格的删除,而不是将所有空格都删除。其实这题可以先将前target个元素反转,然后将target后面的元素反转,最后反转所有字符串。我的想法是,创建一个新的字符串,然后写两个for循环将题目中的字符串按照要求放到新字符串里面。我们可以先将字符串中的多余空格全部去除,然后反转整个字符串,最后将每个单词反转即可。

2023-11-01 18:37:33 267 1

原创 代码随想录算法训练营第七天|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

然后将nums[i]+nums[left]+nums[right]做判断,如果nums[i]+nums[left]+nums[right]>0,说明我们需要将右指针往左边移动,因为数组是排过序的,右指针最开始指向的元素是最大的,nums[i]+nums[left]+nums[right]>0了说明我们要将其中大的元素变小一点。如果nums[i]+nums[left]+nums[right]=0我们就记录三元组{nums[i],nums[left],nums[right]},这就是双指针法的思路。

2023-10-31 17:09:23 571 3

原创 代码随想录算法训练营第6天|● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

我们注意到题目中不考虑输出结果的顺序,并且输出结果中的每个元素一定是唯一的,所以我们可以考虑使用数组,unordered_set,unordered_map,这三种结构构造哈希表。然后可以使用一个for循环去遍历nums2中的所有元素,将nums2中的元素作为关键码去哈希表nums中查找,如果能查找到,说明该数是nums1和nums2的交集元素。set和multiset的底层实现为红黑树,所以它们是有序的,并且查找效率和增删效率都是O(log n),并且不能更改数值,因为改变红黑数的数值会导致整棵树错乱。

2023-10-30 16:17:18 678 1

原创 代码随想录算法训练营第四天|24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点 、 面试题 02.07. 链表相交 、142.环形链表II 、链表总结

注意这个时候由于第一个节点的指针域指向了第三个节点,所以我们通过cur无法找到第二个节点,要想使第二个节点指向第一个节点,完成交换操作,我们需要使用临时指针,也就是temp->next = cur->next(我们可以通过cur找到第一个节点),也就相当于第二个节点指向了第一个节点。所以我们可以先计算俩个链表,链表A和链表B的长度,然后我们可以写一个交换函数,把链表A控制成长的那个链表,就是做一个判断:链表B长度大于A的话,直接交换A和B的长度,然后A和B的头节点交换。写的可能不是很清楚,画了个图。

2023-10-28 15:19:12 1429 1

原创 代码随想录算法训练营第三天| 链表理论基础 、 203.移除链表元素、 707.设计链表 、 206.反转链表

这里需要注意,因为链表的下标是从0开始,也就是说真正头结点的下标为0,所以链表最后一个元素的下标为Listsize-1,所以我们的条件可以为>=。还需要一个位置指针cur,其指向虚拟头结点,用cur去寻找链表中值和val相等的结点的前一个结点,也就是cur->next->val ==val 的时候,进行结点的删除操作。为什么是与val值相等的结点的前一个结点,而不是该节点,是因为,如果cur指向该节点的话,就找不到其前一个结点了,结点的删除操作是该结点的前一个结点指向该结点的后一个结点。

2023-10-27 20:41:25 906 1

原创 代码随想录训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

即在sum>=target的时候,这个时候我们还是会和暴力解法做一样的操作,就是记录子数组的长度,然后将他与result比较,与暴力解法不同的是,我们因为前面还预设了一个指针,我们可以通过往前移动指针,然后用sum-nums[i]来移动窗口,这样做就避免了将所有的子数组全部找出来。做这题,我们要先明确,n×n数组要转多少圈,我们可以统一是n/2圈不管是奇数还是偶数,区别在于奇数转了n/2圈后会留下一个中心点,中心点的数组下标为(n/2,n/2),如果n为奇数我们可以将其单独赋值为n*n。

2023-10-26 18:38:29 30

原创 代码随想录算法训练营第一天|704. 二分查找,27. 移除元素

这里最神奇的是移动过程,它并不是下标移动,而是指针所指的值移动,也就是说每次移动都是一个赋值的过程,在没遇到第一个val之前,将快指针指向的值一直赋给慢指针指向的值,因为它们是以相同的速度移动,所以这个值其实一直没变。也就是我上面所说的,右指针指向哪里的问题。左指针指向数组的开始,也就是下标为0的位置,右指针可以指向数组的最后一个元素,也可以指向NULL,这个涉及到边界问题。因为是要移除数组的元素,所以移除的操作其实为覆盖操作,就比如要移除下标为i的元素,其实就是要i后面的元素一直往前覆盖。

2023-10-25 12:08:50 1281

空空如也

空空如也

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

TA关注的人

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