LeetCode刷题
文章平均质量分 54
LeetCode刷题
_Return_My_Offer_
CSDN官方认证C/C++领域新星创作者 23年CSDN官方成都赛道Top3 玩转C/C++ 数据结构与算法 Linux MySQL 计算机网络 实战项目 蓝桥杯 LeetCode/牛客网刷题 剑指Offer
展开
-
【LeetCode刷题(数据结构与算法)】:反转链表||
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5]原创 2023-10-24 18:20:51 · 94 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:三数之和(数组+指针+排序)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 请你返回所有和为 0 且不重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]输入:nums = [0,1,1]输入:nums = [0,0,0]输出:[[0,0,0]]原创 2023-10-24 16:16:47 · 145 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:将二叉搜索树转化为排序的双向链表
将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针示例 1:输入:root = [4,2,5,1,3]输出:[1,2,3,4,5]原创 2023-10-21 21:13:17 · 241 阅读 · 0 评论 -
【LeetCode刷题】:仅仅反转字母(双指针+字符串)
我们使用 left 指针从左边开始扫描字符串 s,right 指针从右边开始扫描字符串 s如果两个指针都扫描到字母,且 left<right,那么交换 s[left] 和 s[right],然后继续进行扫描;输入:s = “Test1ng-Leet=code-Q!输出:“Qedo1ct-eeLg=ntse-T!输入:s = “a-bC-dEf-ghIj”输出:“j-Ih-gfE-dCba”所有英文字母(小写或大写)位置反转。所有非英文字母保留在原有位置。输入:s = “ab-cd”输出:“dc-ba”原创 2023-10-21 16:00:08 · 193 阅读 · 1 评论 -
【LeetCode刷题(数据结构与算法)】:二叉树的最大深度
而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。输入:root = [3,9,20,null,null,15,7]给定一个二叉树 root ,返回其最大深度。输入:root = [1,null,2]原创 2023-10-19 13:58:14 · 106 阅读 · 3 评论 -
【LeetCode刷题(数据结构与算法)】:数据结构中的常用排序实现数组的升序排列
现在我先将各大排序的动图和思路以及代码呈现给大家。原创 2023-10-18 20:08:20 · 586 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和
一、什么是二叉搜索树二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质非空左子树的所有键值小于其根结点的键值非空右子树的所有键值大于其根结点的键值左、右子树都是二叉搜索树上图值为10的结点的右子树为7,比10小,不满足条件2,所以这棵树不是二叉搜索树上图各个结点都满足条件,所以这棵树是二叉搜索树上图各个结点都满足条件,所以这棵树也是二叉搜索树。原创 2023-10-18 18:25:38 · 103 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:链表中的两数相加
给你两个非空的链表,表示两个非负的整数 它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字请你将两个数相加,并以相同形式返回一个表示和的链表你可以假设除了数字 0 之外,这两个数都不会以 0 开头示例1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,原创 2023-10-17 16:30:53 · 96 阅读 · 4 评论 -
【LeetCode刷题(数据结构与算法)】:有效的括号
当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。如果不是相同的类型,或者栈中并没有左括号,那么字符串 s 无效,返回 False。哈希表的键为右括号,值为相同类型的左括号。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回 False,省去后续的遍历判断过程。在遍历结束后,如果栈中没有左括号,说明我们将字符串 s 中的所有左括号闭合,返回True,否则返回 False。原创 2023-10-17 14:01:30 · 105 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。原创 2023-10-17 13:24:58 · 417 阅读 · 0 评论 -
【LeetCode(LeetCode刷题经典一百题)】:移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序请注意 ,必须在不复制数组的情况下原地对数组进行操作示例 1:输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]示例 2:输入: nums = [0]输出: [0]原创 2023-10-17 13:13:53 · 145 阅读 · 0 评论 -
【LeetCode(数据结构与算法)】:反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]原创 2023-10-17 09:43:50 · 86 阅读 · 1 评论 -
【LeetCode刷题(数据结构与算法)】:验证二叉树的前序序列化
然后判断二叉树的左子树或者右子树是否有值 有值的话不光要消耗一个空间 而且要额外开辟两个空间用于存放下一个值或者是保存NULL 右子树也是如此。例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。输入: preorder = “9,3,4,#,#,1,#,#,2,#,6,#,#”保证 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’。输入: preorder = “9,#,#,1”你可以认为输入格式总是有效的。原创 2023-10-17 09:29:48 · 78 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:用栈实现队列
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。每次 pop或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。将一个栈当作输入栈,用于压入 push 传入的数据;另一个栈当作输出栈,用于 pop和 peek 操作。原创 2023-10-16 20:23:06 · 64 阅读 · 1 评论 -
【LeetCode刷题(数据结构与算法)】:用队列实现栈
为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。的前端元素并返回即可,获得栈顶元素操作只需要获得 queue1。用于存储栈内的元素,判断栈是否为空时,只需要判断 queue1。// 返回 False。的前端的元素即为新入栈的元素,再将 queue1。原创 2023-10-16 19:38:38 · 161 阅读 · 0 评论 -
【LeetCode刷题(数组and排序)】:存在重复元素
给你一个整数数组 nums。如果任一值在数组中出现 至少两次 ,返回 true;如果数组中每个元素互不相同,返回 false示例 1:输入:nums = [1,2,3,1]输出:true示例 2:输入:nums = [1,2,3,4]输出:false示例 3:输入:nums = [1,1,1,3,3,4,3,2,4,2]输出:true。原创 2023-10-16 18:55:33 · 580 阅读 · 1 评论 -
【LeetCode刷题(数据结构与算法面试题)】:最小高度树
递归的基准情形是最小高度二叉搜索树不包含任何数字,此时最小高度二叉搜索树为空 在给定中序遍历序列数组的情况下,每一个子树中的数字在数组中一定是连续的,因此可以通过数组下标范围确定子树包含的数字,下标范围记为 [left,right]对于整个中序遍历序列,下标范围从 left=0到right=nums.length−1当left>right\textit{left}>\textit{right}left>right 时,最小高度二叉搜索树为空。给定有序数组: [-10,-3,0,5,9]原创 2023-10-16 15:47:11 · 129 阅读 · 1 评论 -
【LeetCode刷题(数据结构与算法)】:对链表进行插入排序
如果是数组的插入排序,则数组的前面部分是有序序列,每次找到有序序列后面的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一位,然后将待插入元素置于插入位置。插入排序的基本思想是,维护一个有序序列,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加 111,直到全部元素都加入到有序序列中。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入 重复直到所有输入数据插入完为止。输出: [-1,0,3,4,5]原创 2023-10-16 14:44:13 · 94 阅读 · 3 评论 -
【LeetCode刷题(数据结构与算法)】:上下翻转二叉树
上面的步骤逐层进行。题目数据保证每个右节点都有一个同级节点(即共享同一父节点的左节点)且不存在子节点。给你一个二叉树的根节点 root ,请你将此二叉树上下翻转,并返回新的根节点。思路:依次交换左 有 根节点 最后返回交过后的根节点即可解决问题。输出:[4,5,2,null,null,3,1]输入:root = [1,2,3,4,5]原来的右子节点变成新的左子节点。原来的左子节点变成新的根节点。原来的根节点变成新的右子节点。输入:root = [1]输入:root = []原创 2023-10-16 13:05:51 · 179 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:平衡二叉树
这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 111,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。输入:root = [1,2,2,3,3,null,null,4,4]输入:root = [3,9,20,null,null,15,7]一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。输入:root = []原创 2023-10-15 21:52:57 · 141 阅读 · 2 评论 -
【LeetCode刷题(数据结构与算法)】:二叉树之左叶子之和
我要利用与运算符来判断一下 左子树是不是为空 左子树的左子树是不是为空以及左子树的右子树是否为空 然后定义一个SUM用于计算数据 最后递归写出来就解决本题了。解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。输入: root = [3,9,20,null,null,15,7]给定二叉树的根节点 root ,返回所有左叶子之和。思路就是如果是一颗空二叉树 我直接就返回0。这都题目用递归的方法就可以解决。输入: root = [1]原创 2023-10-15 21:36:50 · 151 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:完全二叉树的节点个数
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。本题我决定采用递归的方法来解决 不光是代码少的原因 更重要的是更容易想到更容易理解。输入:root = [1,2,3,4,5,6]输入:root = [1]输入:root = []原创 2023-10-15 21:20:08 · 151 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:二叉树的后序遍历
给你一棵二叉树的根节点root 返回其节点值的后序遍历示例 1:输入:root = [1,null,2,3]输出:[3,2,1]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]原创 2023-10-15 20:34:58 · 80 阅读 · 0 评论 -
【LeetCode刷题(数据结构与算法)】:二叉树的中序遍历
给定一个二叉树的根节点root 返回它的中序遍历示例1:输入:root = [1,null,2,3]输出:[1,3,2]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]这里给大家复习一下二叉树的前序遍历的递归展开图 大家对照着二叉树前序遍历的递归展开图画出二叉树中序遍历的递归展开图就很好理解我们的中序遍历的过程了看下图前序遍历递归展开图中序遍历。原创 2023-10-15 20:27:57 · 90 阅读 · 0 评论 -
【LeetCode刷题(数据结构)】:给定一个链表 每个节点包含一个额外增加的随机指针 该指针可以指向链表中的任何节点或空节点 要求返回这个链表的深度拷贝
新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]输入:head = [[3,null],[3,0],[3,null]]原创 2023-10-14 21:23:07 · 386 阅读 · 4 评论 -
【LeetCode刷题(数据结构)】:给定一个链表 返回链表开始入环的第一个节点 如果链表无环 则返回 NULL
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况不允许修改链表输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点。原创 2023-10-14 20:59:01 · 388 阅读 · 2 评论 -
【LeetCode刷题(数据结构)】:二叉树的前序遍历
给你二叉树的根节点root 返回它节点值的前序遍历示例1:输入:root = [1,null,2,3]输出:[1,2,3]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]示例 4:输入:root = [1,2]输出:[1,2]示例 5:输入:root = [1,null,2]输出:[1,2]原创 2023-10-14 20:33:13 · 314 阅读 · 2 评论 -
【LeetCode刷题(数据结构)】:另一颗树的子树
首先:compare函数是比较两棵树是否相等的函数,因为如果一棵树是另一棵树的子树,那么必定存在这棵树和另一棵树的子树相等。输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]剩下的就是,节点上的数值相等,进而要向下比较它们的子树是否相等,使用递归,分别比较左右子树是否相等,注意:一定要都相等才可以。否则的话,按照根左右的方法来进行比较,由递归可知,只要存在完全相等的部分,函数的返回值就是真的。若其中一个为空,另一个非空,则两树不等。原创 2023-10-14 20:12:40 · 340 阅读 · 4 评论 -
【LeetCode刷题(数据结构)】:对称二叉树
L.left.val = R.right.val :即 LLL 的 左子节点 和 RRR 的 右子节点 对称。L.right.val = R.left.val :即 LLL 的 右子节点 和 RRR 的 左子节点 对称。根据以上规律,考虑从顶至底递归,判断每对左右节点是否对称,从而判断树是否为对称二叉树。输入:root = [1,2,2,null,3,null,3]L.val = R.val :即此两对称节点值相等。输入:root = [1,2,2,3,4,4,3]原创 2023-10-14 19:50:23 · 338 阅读 · 0 评论 -
【LeetCode刷题(数据结构)】:检查两颗树是否相同
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的输入:p = [1,2,3], q = [1,2,3]输出:true输入:p = [1,2], q = [1,null,2]输出:false输入:p = [1,2,1], q = [1,1,2]输出:false前言两个二叉树相同,当且仅当两个二叉树的结构完全相同,且所有对应节点的值相同。因此,可以通过搜索的方式判断两个二叉树是否相同。原创 2023-10-14 19:36:52 · 504 阅读 · 0 评论 -
【LeetCode刷题(数据结构)】:翻转二叉树
思路与算法这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root\textit{root}root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root\textit{root}root 为根节点的整棵子树的翻转代码复杂度分析时间复杂度:O(N) 其中 NNN 为二叉树节点的数目。我们会遍历二叉树中的每一个节点,对每个节点而言,我们在常数时间内交换其两棵子树。原创 2023-10-14 19:21:39 · 354 阅读 · 0 评论 -
【牛客网刷题(数据结构)】:环形链表的约瑟夫问题
具体来说,我们可以先构建一个包含n个节点的环形链表,然后从第一个节点开始遍历链表,每次遍历m个节点,将第m个节点从链表中删除。好环形链表的约瑟夫问题是一个经典的问题,它的描述如下:有n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,直到剩下最后一个人。开始5个人 1,2,3,4,5 ,从1开始报数,1->1,2->2编号为2的人离开。1,3,4,5,从3开始报数,3->1,4->2编号为4的人离开。1,3,5,从5开始报数,5->1,1->2编号为1的人离开。原创 2023-10-14 18:57:11 · 485 阅读 · 17 评论 -
【Leetcode刷题(数据结构)】:三路划分与三数随机取中的思想实现快速排序的再优化
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,同学们在写递归框架时可想想二叉树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。原创 2023-10-13 20:38:12 · 394 阅读 · 21 评论 -
【Leetcode刷题(数据结构)】:单向链表
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [ ], val = 1输出:[ ]示例 3:输入:head = [7,7,7,7], val = 7输出:[ ]思路如下见详细代码上述注释掉的代码是我在写的时候犯的错误,大家也可以试着自己写写看会不会和我犯同样的错误。原创 2023-07-30 10:40:06 · 731 阅读 · 19 评论