自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

思路:依然是前中后序遍历和层序遍历都可,但是考虑到时间复杂度要小于O(n),就要利用到完全二叉树的性质了,对于每一颗子树,我们只需要判断最左边和最右边是否相等就行了,这样的话,中间的值我们就不用求。如果相等,那么该子树的节点个数为(leftNums*2+1),如果两边不相等,那么再去判断它的两颗子树即可,值得注意的是只有一个节点的树也是满二叉树。要注意题目描述,必须是叶节点到根节点,根节点只有左子树或右子树的不能算成1.思路:两种思路,递归法用前后序遍历做,或者迭代法用层序遍历做。

2023-07-27 22:50:58 132 1

原创 代码随想录算法训练营day15 | LeetCode 层序遍历 226.翻转二叉树 101. 对称二叉树

思路:其实就是一道遍历题,只不过遍历到每个节点的时候将该节点的左右孩子给翻转一下。这里给出个人认为最难的迭代中序遍历的方法。思路:可能是距今为止唯一一道标为“简单”却不简单的题。递归的做法,递归出口的条件还是很复杂的。非递归做法,更直白一些。思路:leetcode上关于这个知识点的题目有十道之多,但是相对来说都比较简单。

2023-07-26 22:59:24 192 1

原创 代码随想录算法训练营day14 | LeetCode 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历

迭代法来遍历二叉树需要考虑的核心点是每次push进去,到时候pop出来的时候,不能还做原来相同的判断,不然会导致程序死循环,因此应该在外层while循环里面不应再用while循环(后来发现可以while,只是不能重复规则判断),应该用if-else来进行规则判断,同时保证未来从栈里面pop出来的元素不能还做相同的判断。今晚最大的收货是学习到了空指针的迭代遍历方法,这种做法能够将三种不同的遍历方式代码风格统一起来。此外,中序遍历的常规迭代方法值得琢磨透来。

2023-07-25 22:30:52 225

原创 代码随想录算法训练营day13 | LeetCode 239. 滑动窗口最大值 347.前 K 个高频元素

这种方法的时间复杂度为nlogk,属于用空间换时间的典型做法,空间复杂度n.思路:想到要用队列做,也知道队列里面需要排序,但是不知道每次移出来的元素怎么处理。看解析知道了原来是要比较队列出口元素和移除元素是否相等,相等的话就移出来,否则还让其呆在队列里面充当最大元素的角色,值得注意的是这题需要用到双端队列做,也就是deque<int>,头文件中需要引入#include<deque>,每次push进来元素的时候要将该元素和队尾的元素意义比较,把比自身小的元素全部从队列中pop_back()出来。

2023-07-24 22:19:20 231

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

思路:一开始也是想到用switch的方法,但是c++中不支持switch匹配字符串,或者说要匹配的话要先实现一个字符串映射成整形或者字符型之类的函数。为了使代码更简洁还是用了if-else的方法。(学到了一个字符串转数字的方法stoi()/stoll())思路:题目不难,两种实现版本,一种看起来逻辑非常清晰,但代码略显臃肿;一种代码简洁,但不能一眼看清实现逻辑,但时间复杂度是一样的。思路:也是经典的用栈解决,和上题类似,就是最后要做一个回滚操作返回处理后的字符串。

2023-07-22 20:20:49 231

原创 代码随想录算法训练营day10 | LeetCode 232.用栈实现队列 225. 用队列实现栈

思路:用栈实现对列,一开始忘记了c++中的栈操作,重新复习了一下,c++中栈、队列的push()、pop()方法都是没有返回值的,栈的顶部元素用top()方法获得,队列的头部元素用front()方法获得。单个栈不用额外空间是没法实现队列的,但是单个队列只需要一个临时变量就可以实现栈,这是两者不同的地方。思路:和上题差不多,这块儿直接上代码。

2023-07-21 21:03:41 349 1

原创 代码随想录算法训练营day09 | LeetCode 28. 实现 strStr() 459.重复的子字符串

思路:典型的kmp算法题,由于很久没接触了,基本忘得一干二净,从头到尾重新学习了一遍kmp算法,再次透彻的理解,核心思想就是当匹配到某个字符不相等时,不能直接从头开始重新匹配,这样时间复杂度太大。这里有个最长相等前后缀字符串的说法,构造next数组时,每次将后缀字符串的尾部和前缀字符串的尾部比较,得到next[i]的值,由于i是一直遍历到str.size()的,当for循环结束,就能够得到整个next数组了。思路:虽然看了提示说要用kmp做,但还是没想出方法(哭死),后来看了卡哥解析才知道怎么做。

2023-07-20 22:40:01 290

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

今天做了五道題目,基本都是用到字符串翻转(局部翻转+整体翻转)和双指针(视情况来resize数组获取额外空间)的做法,收获不小。

2023-07-19 22:57:56 277

原创 代码随想录算法训练营day07 | LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

思路:首先想到的就是暴力,直接四个for循环(用ordered_map记录重复的元素及其出现的次数,来简单优化一下)没想到还是超时了,后来就拆开来,用两个两层for循环(推荐以后凡是碰到多个数组,但是每个数组长度不是太大都可以这么做)。

2023-07-18 22:39:25 226 1

原创 代码随想录算法训练营day06 | LeetCode 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

解析才知道怎么做的,知道了怎样判断一个数是不是快乐数,就是可以将每次的求和都记录下来,如果某一次的求和结果在之前的求和结果中出现过,那么这个数一定不是快乐数(出现了循环)。思路:核心就是要统计两个字符串中出现的字符及其出现的次数,就应该想到要用集合做,本体采用的是类哈希表的做法,巧妙地用数组存储每个字符出现的次数,然后两两进行比较。思路:也是用集合的方式,注意题目中说输出的集合中的元素唯一,并且给定了数组元素大小范围,那么就可以采用自定义数组,和上题一样的做法。思路:这题也是除了暴力根本没思路,后来看了。

2023-07-17 21:03:55 256 1

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

思路:看到倒数我的第一想法就是用递归,从后往回计数,每次加1,加到等于n的时候就删除,这样就需要每次传两个指针(或者不嫌麻烦也可以只穿一个指针,只不过到时候要判断->next->next!提供的双指针的做法(不得不感叹双指针是真行啊),让一个快指针先走n步,然后慢指针和快指针一起走,等到快指针走到链表尾了,慢指针指向的位置也就是倒数第n个了。的解析才知道怎么做的,原来只需要先便利两个链表计数,然后根据元素个数的差值尾部对齐,然后开始找就行了,这样只要当指针的内容相同时就知道两个链表相交。

2023-07-15 20:44:00 248 1

原创 代码随想录算法训练营day03 | LeetCode 203.移除链表元素 707.设计链表 206.反转链表

思路:遍历一遍链表元素,删除相同值的元素,唯一要注意的就是头结点和非头结点的删除方式有些区别,由此衍生出一下两种方法,第一种方法把头结点区别开来,第二种方法引入一个虚拟的头结点,剩余的节点就可以统一对待了。),严格来说其实用到了三根指针,从前往后遍历,每次反转前面的指针时,都要留一根指针在后面做好准备,不然链表断开就找不到了。思路:单链表就很简单,就没考虑用双链表做了,无非就是增删改查这几种链表的常用方法,也可以看作是复习一下c++里面的类的成员变量创建了。

2023-07-14 20:31:56 319 1

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

思路:看到题目描述要时间复杂度为O(n)基本知道又是一道双指针做法的题了,先把原数组每个元素求平方,左右两边各一个指针,每次取较大的值赋值给新数组(新数组采用头插法),唯一要注意的就是用vector定义数组并赋值的方法,只有定义了数组大小才能用索引的方式来遍历,否则用push_back就只能尾插法,此题不适用。,按照固定的区间(每次都是左闭右开等),题目没难度,就是要注意代码编写的严谨程度,需要很细心。977.有序数组的平方(59.螺旋矩阵II(

2023-07-13 22:27:04 322 1

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

这种方法相当于一行田埂,有很多坑位,有的坑位里中了萝卜,有的坑位没种萝卜,现在要让萝卜从左向右连续不能间断。左边找坑位,右边找萝卜,把右边的萝卜往左边的方法里填。后面看到卡哥的解析重新拾起了双指针的方法,其实主要还是靠fastIndex指针每次找到需要保存下来的元素,slowIndex可以看做是新数组的尾指针,这种方法时间复杂度为O(n),而且很好理解,强烈推荐!思路:第一眼看到题目描述就想直接枚举了,但还是按照二分查找的方式写了一遍,唯一要注意的就是每次区间闭合的问题,要保持一致性。704. 二分查找(

2023-07-12 21:16:07 634 1

空空如也

空空如也

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

TA关注的人

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