自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【LeetCode】day24:93 - 复原IP地址, 78 - 子集, 90 -子集II

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。与经典回溯法思路相同,对于终止条件的判断,仅当起始位置start到达数组末尾即遍历完所有元素时返回,且在判断终止条件前将当前_path计入结果(避免遗漏含有数组最后一个元素的子集)。,对数组排序后进行去重操作,对于每次迭代的当前层,若当前值与前一个索引对应值相同则只记录每一层起始位置的值,防止结果遗漏以及由于在同一层选择相同元素导致的重复。解集 不能 包含重复的子集。

2024-08-08 22:07:40 421

原创 【LeetCode】day23:39 - 组合总和, 40 - 组合总和II, 131 - 分割回文串

思路同上不再赘述,由于编号集合中每个数字出现的次数不保证唯一,所以需要添加对结果的去重操作,比如示例1中只能出现1 2 5或2 1 5。给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。注意:解集不能包含重复的组合。

2024-07-29 00:50:37 625

原创 【LeetCode】day22:77 - 组合, 216 - 组合总和, 17 - 电话号码的字母总和

取k的数的组合,直接的思路就是按顺序从第一个数开始列举,比如1 2 3 4的两个数组合,就是1 2, 1 3, 1 4, 然后2 3, 2 4, 最后3 4。回溯法是一种深度优先搜索的方法,类似与二叉树寻找叶子节点,回溯法通过递归向更深层寻找解,寻找之后撤销操作回溯并尝试其他路径,而这个路径用for循环表示,代表当前深度的所有可能情况。对给出的字符串中数字 所对应的所有字母一一组合,字符串的长度就代表的遍历的层数。使用index记录字符串的索引,也代表了当前迭代的深度,类似的使用回溯法完成操作。

2024-07-25 00:36:09 613

原创 【LeetCode】day21:669 - 修剪二叉搜索树, 108 - 将有序数组转换为二叉搜索树, 538 - 把二叉搜索树转换为累加树

大于等于当前节点值的所有值之和,即为当前节点值与其右子树所有节点值、以及当前递归所累积的sum总和。由于是二叉搜索树,剪枝情况可以简化:当前节点值小于边界low时,由于左子树中所有值均小于当前节点值,所以可以直接返回右子树;同理当前节点值大于边界high时,由于右子树中所有值均大于当前节点值,所以可以直接返回左子树。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

2024-07-25 00:05:40 366

原创 【LeetCode】day20:235 - 二叉搜索树的最近公共祖先,701 - 二叉搜索树中的插入操作, 450 - 删除二叉搜索树中的节点

重点要有两个子节点的情况,由于是二叉搜索树,右子树中的所有节点值均大于当前节点值,因此也均大于左子树的所有节点值,而右子树的最小元素位于最左叶子节点,所以将当前节点的左子树 作为右子树的最左叶子节点的左子树 是符合二叉搜索树的规则的。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。以上为对有两个子树的节点的直接删除操作,除此之外由于二叉搜索树的性质,也可以通过使当前节点替换为最左叶子节点的方式,替换并删除节点后返回当前节点。

2024-07-23 00:19:47 324

原创 【LeetCode】day18:530 - 二叉搜索树的最小绝对差, 501 - 二叉搜索树中的众数, 236 - 二叉树的最近公共祖先

题中有前提是p和q在树中存在,在这一前提下的思路:对于遍历到的节点,在左右子树下分别寻找p和q的公共节点,若找到公共节点或是p和q其中之一则将其返回。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。解释:节点 5 和节点 4 的最近公共祖先是节点 5。

2024-07-21 19:32:04 894

原创 【LeetCode】day17:654 - 最大二叉树, 617 - 合并二叉树, 700 - 二叉树搜索树中的搜索, 98 - 验证二叉搜索树

判断一个树是否是二叉搜索树最简单的逻辑:其左右子树是否是二叉搜索树,当前节点值是否大于左节点小于右节点。不同的是在初值判断的过程中,若其中一个节点为空则直接返回另一个节点作为合并后的节点,其他过程使用前序遍历即可。,不满足二叉搜索树的条件,所以在递归的同时需传入边界,向左子树前进时需传入根节点的值作为最大值的限制,向右子树前进时需传入根节点的值作为最小值的限制。输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]输出:[3,4,5,5,4,null,7]

2024-07-21 16:39:50 784

原创 【LeetCode】day16:513 - 找树左下角的值, 112 - 路径总和, 113 - 路径总和II, 105 - 从前序和中序遍历序列构造二叉树,106 - 从中序和后序遍历序列构造二叉树

相当于遍历所有从根节点到叶子节点的路径,并从中找到所有节点和为target的路径,思路与我昨天的文章Day15中的寻径问题一致,在前序遍历判断当前节点是否是叶子节点且和是否满足要求,接着回溯并完成循环。根据这一特性,在前序遍历序列获取第一个元素的值即根节点的值,在中序遍历中找到该值对应的索引,索引左侧序列作为左子树,右侧作为右子树,并计算这个左右子树的长度在前序中进行划分,传入dfs递归中进行处理。输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]

2024-07-19 00:42:57 699

原创 【LeetCode】day15:110 - 平衡二叉树, 257 - 二叉树的所有路径, 404 - 左叶子之和, 222 - 完全二叉树的节点个数

另外使用迭代法进行遍历时,原理相同,在push节点进入记录节点的stack时同时将当前路径同时push进入记录路径的stack中,这样在每次循环获取当前节点时获取到的路径是对应的。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。同理可以使用迭代法,通过确认左节点的方式:若左节点不为nullptr且为叶子节点,则记录结果,除此之外的所有都不算左叶子。输入:root = [1,2,3,4,5,6]

2024-07-17 23:54:40 1352

原创 【LeetCode】day14:226 - 翻转二叉树, 101 - 对称二叉树, 104 - 二叉树的最大深度, 111 - 二叉树的最小深度

思路与上题大致相同,特别的是只有当节点的左右节点均为nullptr时该节点才为叶子节点,此时方才计入最小深度的统计中,其余情况须继续遍历。判断二叉树是否轴对称,即依次判断:从根节点出发分别往左往右出发,当前节点值是否相等(若存在),以及左节点的右节点和右节点的左节点是否轴对称。思路为遍历二叉树,对于当前节点作为根节点的节点,其最大深度为左子树的最大深度和右子树的最大深度中的最大值加一。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。

2024-07-17 21:18:22 334

原创 【LeetCode】day13:144 94 145 - 二叉树的前、中、后序遍历, 102 - 二叉树的层序遍历

对于后序遍历,直接按后序的顺序实现会比较麻烦,因为是左->右->中的顺序,不仅需要判断左右是否为空,还需要判断当前节点在树中的位置比如是否有子树并分别处理。对二叉树按迭代方式遍历,原理相同都是根据处理当前节点相对于处理左右节点的位置来区分前、中、后序,但不如递归方式直观。每次循环都代表处理一层,循环开始时获取队列的size表示当前层所包含的节点数量,依次出队处理:获取当前节点并将其左右节点(若不为空)压入队列,最后将当前层的所有节点值记录压入res,持续循环直到队列为空表示当前层无节点。

2024-07-15 23:30:53 497

原创 【LeetCode】day11:150 - 逆波兰表达式求值, 239 - 滑动窗口最大值, 34 - 前K个高频元素

当遍历到索引k-1时,其之后的每一次前进都需要对应一个窗口最大值的结果记录到res中,而这个窗口的最大值为队列头元素索引对应的值(nums[dq.front()])。思路为构建一个单调队列用于记录窗口滑动过程中当前窗口的值按大小的依次排列,队列头部表示当前最大值的索引,随着窗口滑动而更新,其后续所有值都依次减小且索引依次增大。输入:tokens = [“10”,“6”,“9”,“3”,”+“,”-11",“输入:nums = [1,3,-1,-3,5,3,6,7], k = 3。

2024-07-14 00:34:01 982

原创 【LeetCode】day10:232 - 用栈实现队列, 225 - 用队列实现栈, 20 - 有效的括号, 1047 - 删除字符串中所有的相邻重复项

遍历字符串并使用栈记录字符,若当前字符与栈顶字符(上一个字符)相同则将栈顶弹出表示两两相消,否则将当前字符压入栈中。括号为左括号和右括号,对字符串遍历时将遇到的左括号压入栈中,每当遇到右括号时将栈顶元素(距离当前右括号最近的左括号),若能匹配则继续否则返回false。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

2024-07-13 19:50:43 928

原创 【LeetCode】day9:151 - 翻转字符串里的单词, 右旋字符串

继续前进直到遍历完成或是当前单词为空格:当在单词中遇见首个空格时(s[i] == ’ ’ && inWord),将inWord置为false表示当前单词截止,将该单词逆序并加入结果res中;字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。首先将字符串完全翻转180度,此时各单词出现的顺序以及单词本身都会逆序,接下来的目的是遍历字符串并对每个单词的拼写顺序进行恢复。

2024-07-11 23:59:18 779

原创 【LeetCode】day8:344 - 反转字符串, 541 - 反转字符串II, 替换数字

以2k为步长遍历字符串,对于不是尾部的情况按前k个反转的逻辑正常处理,在当前的位置若剩余字符小于k个则反转全部并返回,其他情况则照常处理。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]输入:s = [“h”,“e”,“l”,“l”,“o”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]输出:[“o”,“l”,“l”,“e”,“h”]输出:“bacdfeg”

2024-07-11 00:07:18 332

原创 【LeetCode】day7:454 - 四数相加, 383 - 赎金信, 15 - 三数之和, 18 - 四数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。

2024-07-09 23:58:36 817

原创 【LeetCode】day6:242 - 有效的字母异位词,349 - 两个数组的交集, 202 - 快乐数, 1 - 两数之和

使用HashSet对其中一个数组进行遍历并记录元素出现的情况,再对另一个数组遍历,若HashSet中存在当前元素则为交集元素,将其存入res中。思路是对数组元素进行遍历,并在过程中使用HashMap对当前数组索引以及元素进行记录,key表示元素的值,value表示索引。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]

2024-07-09 02:34:25 839

原创 【LeetCode】day4:24 - 两两交换链表中的节点, 19 - 删除链表的倒数第N个节点, 160 - 相交链表, 142 - 环形链表

直观的思路是首先获取链表的节点个数len,删除链表的倒数第N个节点即删除从head处开始的第len-n个节点,定义两个指针pre和cur分别从dummy和head移动,cur在遍历步长结束时指向需要被删除的节点,而这里的pre用来记录cur的前节点用于删除。要实现当前节点A和下一个节点B的两两交换需完成:记录A节点的前节点pre,记录B节点的后节点tmp=B->next,交换节点指向即B指向A,然后pre指向B以及A指向tmp,如下图。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。

2024-07-07 21:24:59 708

原创 【LeetCode】day3:203 - 移除链表元素,707 - 设计链表, 206 - 反转链表

另一种思路是递归的实现,将任务分解为:使当前节点指向前一个节点,接着返回以当前节点为头节点翻转转后的新链表头节点。将后续链表看作一个整体,定义函数为返回翻转后的链表的头节点,并使head指向pre,在当前的递归轮次可以视为这个后续链表已调用该函数完成翻转,且翻转后的尾节点已指向cur,使当前cur指向pre即可,如图。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。输入:head = [1,2,3,4,5]

2024-07-05 23:58:34 843

原创 【LeetCode】day2:977 - 有序数的平方, 209 - 长度最小的子数组, 59 - 螺旋矩阵

按照需要画出的正方形的圈数(n/2)进行循环,进入循环时当前的圈数(cur)对应的元素nums[cur][cur]就是当前正方形的左上角。注意到题目有个前提是数组中元素均为正整数,上述代码也是基于这一前提的,这一点保证了当right前进时总和一定是增大的,对于当前区间当区间长度减小时总和一定是减小的。输入:target = 11, nums = [1,1,1,1,1,1,1,1]输入:target = 7, nums = [2,3,1,2,4,3]输出:[[1,2,3],[8,9,4],[7,6,5]]

2024-07-05 02:38:46 907

原创 【LeetCode】day1:704 - 二分查找, 27 - 移除元素

目的是对数组所有元素进行遍历查找,那么直观的思路就是left指向数组最左边的元素(0),right指向数组最右边的元素(nums.size()-1),以二分的方式逐渐收缩逼近,直到两者相遇或交错代表查找结束(left<=right)。元素的顺序可能发生改变。解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。输入: nums = [-1,0,3,5,9,12], target = 2。输入:nums = [0,1,2,2,3,0,4,2], val = 2。

2024-07-04 02:32:50 857 1

原创 【读书笔记】CSAPP第二章

CSAPP第二章读书笔记

2022-06-14 15:06:07 192 1

原创 【读书笔记】CSAPP第一章

CSAPP读书笔记chap1

2022-06-11 14:57:24 100

空空如也

空空如也

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

TA关注的人

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