自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第28天 | leetcode 491.递增子序列 46.全排列 47.全排列2

思路:unordered_set<int> uset;​力扣 491.递增子序列。​力扣 47.全排列2。​力扣 46.全排列。

2023-10-22 20:42:41 48

原创 第27天 | leetcode 93.复原ip地址 78.子集 90.子集2

思路:s【i】,表示字符串中的一位,S【i】-0. 把字符串转化成数字。num*10,是下一个循环的时候上一位数字要左移。假设s=【255】, 循环三次的结果就是 2->25->255.思路:和组合题目区别在于:每进入一层递归,就要收集一个结果子集。​力扣 93.复原ip地址。​力扣 90.子集2。

2023-10-22 16:33:47 42

原创 第26天 | leetcode 39.组合总和 40.组合总和2 131.分割回文串

循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。思路:条件used【i-1】==0,即前一个元素是未使用过的才进行去重。思路:可以出现重复元素,单层递归startindex传入当前i即可。首先判断这个子串是不是回文,如果是回文,就加入在。中,path用来记录切割过的回文子串。​力扣 131.分割回文串。​力扣 40.组合总和2。​力扣 39.组合总和。

2023-10-20 21:16:41 42

原创 第25天 | leetcode 216.组合总和 17.电话号码的字母组合

​力扣 17.电话号码的字母组合。​力扣 216.组合总和。

2023-10-18 12:09:56 39

原创 第24天 | leetcode 77.组合 回溯剪枝

思路:i

2023-10-16 20:48:50 21

原创 第22天 | leetcode 669.修建二叉搜索树、108.将有序数组转换为二叉树、538.把二叉搜索树转换为累加树

​力扣 538.把二叉搜索树转换为累加树。​力扣 108.将有序数组转换为二叉树。思路:二分法判定区间,左闭右闭。​力扣 669.修建二叉搜索树。

2023-10-15 13:28:21 32 1

原创 第21天 | leetcode 235.二叉搜索树的最近公共祖先、701.二叉搜索树中插入操作、450.删除二叉搜索树的节点

1.没找到删除节点 2.删除的是叶子结点,左右为空 3.左空右不空 4.左不空右空 5.左右都不为空,需要调整二叉树结构。思路:二叉搜索树是有序的,当pq值都小于当前节点值是,公共祖先在左子树,pq值都大于当前节点值,公共祖先在右子树。思路:终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。​力扣 235.二叉搜索树的最近公共祖先。​力扣 701.二叉搜索树中插入操作。​力扣 450.删除二叉搜索树的节点。

2023-10-13 12:28:33 31

原创 第20天 | leetcode 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.验证二叉树

思路:频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集,因为结果集之前的元素都失效了。思路:如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。思路:定义一个pre指向当前节点的前一个节点。​力扣 530.二叉搜索树的最小绝对差。​力扣 236.二叉树的最近公共祖先。​力扣 501.二叉搜索树中的众数。

2023-10-13 11:19:32 25

原创 第19天 | leetcode 654.最大二叉树、617.合并二叉树、98.验证二叉树、700.二叉搜索树中的搜索

思路:如果root1为空,合并后为root2;如果root2为空,合并后为root1。​力扣 700.二叉搜索树中的搜索。​力扣 654.最大二叉树。​力扣 617.合并二叉树。思路:中序遍历判断是否有序。力扣 98.验证二叉树。

2023-10-12 23:29:02 27

原创 第18天 | leetcode 513.找树左下的值、112.路径总和、105、106从中序与后序遍历序列构造二叉树

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)1.明确递归函数参数和返回值,count记录总和,每遍历一个节点,count值减少。2.本题没有中的处理逻辑,无论哪种情况,都会优先处理左,终止条件是遍历到叶子节点。2.当处理到叶子节点,且count值为0,找到了一条符合条件的路径就返回。第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。第五步:切割后序数组,切成后序左数组和后序右数组。

2023-10-11 09:26:59 28

原创 第17天 | leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

思路:终止条件为空节点和叶子结点,因为叶子节点有左右之分,必须根据父节点发过来判断是否为左叶子节点。递归过程当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。思路:1.明确递归函数参数和返回值,如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。2.终止条件仍然是空节点 3.分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

2023-10-09 22:12:40 29 1

原创 第十五天| leetcode 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

思路:深度是节点是到根节点的距离,高度是节点到叶子结点的距离。求出根节点的高度即是二叉树的最大深度。思路:和104题类似,但是n叉树的根节点的子节点用数组的方式来遍历。思路:相比求最大深度,需要额外处理左右孩子不为空的逻辑。​力扣 222.完全二叉树的节点个数。​力扣 104.二叉树的最大深度。​力扣 111.二叉树的最小深度。​力扣 559.n叉树的最大深度。

2023-10-07 21:37:06 32 1

原创 第十四天| leetcode 102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

思路:递归三步走,前序后序遍历都可以。如果使用中序遍历也可以,需要递归调用两次root->left。思路:层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。​力扣 102. 二叉树的层序遍历。​力扣 101. 对称二叉树。​力扣 226.翻转二叉树。

2023-10-06 22:46:35 46 1

原创 第十二天| leetcode 二叉树理论,二叉树遍历

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

2023-10-05 21:57:05 22

原创 第十二天 | Leetcode 347.前 K 个高频元素、239. 滑动窗口最大值

​力扣 347.前 K 个高频元素。​力扣 239. 滑动窗口最大值。

2023-10-04 14:34:39 35 1

原创 第十一天 Leetcode 20.有效的括号、1047.删除字符串中所有相邻重复项、150.逆波兰表达式求值

第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。思路:用栈来存放已经遍历过得元素,如果相等,从栈中弹出,遍历结束后剩余在栈中的元素翻转就是移除后的字符串。第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。思路:逆波兰表达式相当于二叉树中的后序遍历。​力扣 150.逆波兰表达式求值。​力扣 20.有效的括号。

2023-10-03 10:38:14 21

原创 第十天 Leetcode 232.用栈实现队列、225.用队列实现栈

push操作只需要将数据放进入栈中就行了。而对于pop操作,需要先判断出栈是否为空,如果为空,将入栈中的元素push进来之后,再弹出数据。peek函数可以复用pop代码,需要注意的是,result被pop弹出来了,因此需要重新push进栈。思路:和上题类似,也可以使用两个队列实现栈的模拟。但是存在优化空间,就是如何使用一个队列实现?思路: 栈是先进后出,而队列是先进先出,因此需要用两个栈来实现队列,一个输入栈,一个输出栈。​力扣 232. 用栈实现队列。​力扣 225. 用队列实现栈。

2023-10-02 14:35:21 65 1

原创 第九天 力扣 KMP 28. 实现 strStr() 459.重复的子字符串

​力扣 28. 实现 strStr()思路:KMP主要用于字符串匹配上,​力扣 459.重复的子字符串。

2023-09-28 16:44:31 169 1

原创 第八天 力扣 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

思路:在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。思路:定义两个指针,两个指针从字符串前后同时向中间移动,用swap函数交换指向的字符。思路:移除多余空格;​力扣 剑指Offer 05.替换空格。​力扣 151.翻转字符串里的单词。​力扣 541. 反转字符串II。​力扣 344.反转字符串。

2023-09-27 22:31:51 236

原创 第七天 力扣 454.四数相加II、 383. 赎金信、 15. 三数之和、 18. 四数之和

思路:将4个数组分成两部分,两个数组一组。首先,定义一个unoredered_map,key存放a+b的和,value存放a+b出现的次数。然后,遍历cd数组,在map中查找target= 0-(c+d)出现的次数,用一个变量count统计出的值就是符合条件的元组数量。思路:双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。思路:和之前242题类似,使用数组记录26个字母出现次数。​力扣 18. 四数之和。

2023-09-27 16:12:10 342

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

思路:本题不仅需要存储元素的值进行求和,最后还需要返回的是元素下标,因此适合用map(键值对)映射求解。map实质上是用来存储访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)思路:判断两个字符串出现的字母是否相同,由于小写英文字母只有26个,数量较少可以使用数组作为一个简单的哈希表,遍历字符串s的时候,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。思路:求和过程中对各个位的求和判断。

2023-09-25 23:48:07 389 1

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

先求出链表ab的长度,得到一个差值l,假设让链表a作为长度最长的,a先移动l个长度,然后再比较ab后面的节点,如果相同则返回。交换节点的过程用图示法会比较清晰,需要注意的是在进行交换时,步骤一和步骤二会将原先指向下一个元素的指针丢失,因此需要定义两个临时指针来保存原来的节点。思路:双指针用法,快指针先移动n+1步,然后快慢指针同时移动,直到快指针为null,此时慢指针指向需要删除节点的前一个节点,之后删除节点即可。思路:快慢指针法,快指针一次移动两步,慢指针一次移动一步。​力扣142.环形链表II。

2023-09-24 16:07:54 552 1

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

思路:遍历链表时,不能直接移动头节点,因为链表最后要返回头结点。所以需要创建一个临时指针指向头结点。第一种:直接使用原来的链表,这种方法分为两个部分,第一部分移除头结点,头结点向后移动一位即可,由于C++内存释放规则,需要创建一个temp指针指向原先需要删除的头节点。第二部分移除其他节点。第二种,创建虚拟头结点,在头结点前创建一个虚拟节点指向头结点,这样移除方式就变成统一的了。​力扣203.移除链表元素。思路:双指针写法 递归写法。​力扣707.设计链表。​力扣206.反转链表。

2023-09-23 23:52:23 642 1

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

定义两个指针,初始指向起点位置,i指针每次移动一个单位,如果统计和sum超出target,j指针开始移动,sum的值会因此减少。简单来说就是只要当前sum的值大于target了,窗口就会缩小,直到找到符合条件的最小子数组为止。思路:由于数组是有序的,因此数组的最大值其实就在最左侧或者最右侧。因此本体非常适合双指针发,i指向起始位置,j指向重点位置。根据两端比较结果,用一个新数组保存。思路:边界条件复杂,按照左闭右开的原则来写。​力扣209. 长度最小的子数组。​力扣977. 有序数组的平方。

2023-09-21 19:01:41 780

原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、34.在排序数组中查找元素的第一个和最后一个位置、35.搜索插入位置。

构造两个函数分别确定左边界和右边界。(找target的右边界时,而left=mid+1,是往右移动的,然后下次移动是在target大于等于mid位置的元素时候,以此类推,直到退出循环)思路:由于本道题目要求的特殊性,nums为无重复元素的升序数组,只需要查找数组中第一个大于等于目标元素的下标位置即可,所以使用暴力法遍历整个数组效率很高。思路:双指针法回顾,分别定义快慢指针,快指针遍历整个数组,寻找不含有需要删除的元素的新数组,慢指针就是用来指向更新后的新数组。

2023-09-20 18:20:45 959

空空如也

空空如也

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

TA关注的人

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