LeetCode
.
Super.Bear
https://github.com/Paraniod1
展开
-
145.二叉树的后序遍历
项目场景:力扣练习题问题描述:提示:这里描述项目中遇到的问题:给定一个二叉树,返回它的 后序 遍历。示例:原因分析:提示:这里填写问题的分析:递归:二叉树的后序遍历:按照访问左子树——右子树——根节点的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树迭代:栈模拟两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而在迭代的时候需要显式地将这个栈模拟出来解决方案:提示:这里填写该问题的具体解决方案:递归/** * Defin原创 2021-11-09 22:19:18 · 197 阅读 · 0 评论 -
94.二叉树的中序遍历
项目场景:力扣练习题问题描述:提示:这里描述项目中遇到的问题:给定一个二叉树的根节点 root ,返回它的 中序 遍历。原因分析:提示:这里填写问题的分析:递归:二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树迭代:栈模拟解决方案:提示:这里填写该问题的具体解决方案:递归/** * Definition for a binary tree node. * struct Tree原创 2021-11-09 22:05:04 · 335 阅读 · 0 评论 -
144. 二叉树的前序遍历
项目场景:提示:这里简述项目相关背景:力扣二叉树遍历问题描述:提示:这里描述项目中遇到的问题:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。原因分析:提示:这里填写问题的分析:(1)实现递归算法的三大步1.确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型2.确定终止条件:写完递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对原创 2021-11-03 22:57:34 · 185 阅读 · 0 评论 -
两两交换链表中的结点
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换原因分析:提示:这里填写问题的分析:双指针:增加一个虚拟头节点,当它的下一个指针域或者下下一个指针域为空时,说明不存在交换节点或者只剩一个交换节点,引入双指针,在循环结束前交换指针关系即可递归:(另解)递归的终止条件是链表中没有节点,或者链表中只有一个节点如果链表中至少有原创 2021-10-22 18:43:59 · 188 阅读 · 0 评论 -
用队列实现栈
项目场景:提示:这里简述项目相关背景:队列练习题问题描述:提示:这里描述项目中遇到的问题:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本原创 2021-10-18 23:09:40 · 240 阅读 · 0 评论 -
删除链表的倒数第N个节点
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。原因分析:提示:这里填写问题的分析:1.双指针:(涉及链表的特殊位置双指针,删除结点,找到前驱节点)需要找到倒数第 n个节点,因此可以使用两个指针 fast 和 slow 同时对链表进行遍历,并且fast 比 slow 超前 n个节点。当 fsat遍历到链表的末尾时,slow 就恰好处于倒数第 n个节点。初始时fast 和 sl原创 2021-10-18 17:37:11 · 195 阅读 · 0 评论 -
括号的最大嵌套深度
项目场景:提示:这里简述项目相关背景:栈练习题问题描述:提示:这里描述项目中遇到的问题:如果字符串满足以下条件之一,则可以称之为 有效括号字符串(valid parentheses string,可以简写为 VPS):字符串是一个空字符串 “”,或者是一个不为 “(” 或 “)” 的单字符。字符串可以写为 AB(A 与 B 字符串连接),其中 A 和 B 都是 有效括号字符串 。字符串可以写为 (A),其中 A 是一个 有效括号字符串 。类似地,可以定义任何有效括号字符串 S 的 嵌套深原创 2021-10-17 23:26:56 · 342 阅读 · 0 评论 -
整理字符串
项目场景:提示:这里简述项目相关背景:栈练习题问题描述:给你一个由大小写英文字母组成的字符串 s 。一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件:若 s[i] 是小写字符,则 s[i+1] 不可以是相同的大写字符。若 s[i] 是大写字符,则 s[i+1] 不可以是相同的小写字符。请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。请返回整理原创 2021-10-17 22:39:59 · 307 阅读 · 0 评论 -
删除字符串中的所有相邻重复项
项目场景:提示:这里简述项目相关背景:栈练习题问题描述:提示:这里描述项目中遇到的问题:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串原因分析:提示:这里填写问题的分析:当字符串中同时有多组相邻重复项时,无论是先删除哪一个,都不会影响最终的结果,因此可以从左向右顺次处理该字符串而消除一对相邻重复项可能会导致新的相邻重复项出现,如从字符串 abba 中原创 2021-10-17 21:48:10 · 1231 阅读 · 0 评论 -
删除最外层的括号
项目场景:提示:这里简述项目相关背景:栈练习题问题描述:有效括号字符串为空 “”、"(" + A + “)” 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s =原创 2021-10-17 21:01:09 · 154 阅读 · 0 评论 -
比较含退格的字符串
项目场景:提示:这里简述项目相关背景:栈练习题问题描述:提示:这里描述项目中遇到的问题:给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,请你判断二者是否相等。# 代表退格字符。如果相等,返回 true ;否则,返回 false 。注意:如果对空文本输入退格字符,文本继续为空。原因分析:提示:这里填写问题的分析:重构字符串:求出原本的字符串,将给定的字符串中的退格符和应当被删除的字符都去除,还原给定字符串的一般形式。然后直接比较两字符串是否相等即可==(strc原创 2021-10-17 20:21:58 · 324 阅读 · 0 评论 -
155.最小栈
项目场景:提示:这里简述项目相关背景:栈练习题问题描述:提示:这里描述项目中遇到的问题:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。原因分析:提示:这里填写问题的分析:基本上都是栈的基础操作解决方案:提示:这里填写该问题的具体解决方案:链栈:typedef struct Mi原创 2021-10-17 13:39:52 · 94 阅读 · 0 评论 -
有效的括号
项目场景:提示:这里简述项目相关背景:栈练习题问题描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。原因分析:提示:这里填写问题的分析:遍历给定的字符串 s,当遇到一个左括号时,会期望在后续的遍历中,有一个相同类型的右括号将其闭合,由于后遇到的左括号要先闭合,因此可以将这个左括号放入栈顶当遇到一个右括号时,需要将一个相同类型的左括号闭合,原创 2021-10-16 22:42:53 · 114 阅读 · 0 评论 -
排序链表
项目场景:提示:这里简述项目相关背景:问题描述:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。原因分析:提示:这里填写问题的分析:自顶向下归并排序基本步骤:(1)找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 22 步,慢指针每次移动 11 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。(2)对两个子链表分别排序(3)将两个排序后的子链表合并,得到完整的排序后的链表通过递归实原创 2021-10-16 20:33:29 · 107 阅读 · 0 评论 -
返回倒数第k个节点
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。原因分析:提示:这里填写问题的分析:1.按照常规的思路,需要先遍历一次链表,统计节点个数,再再第二次遍历中获取要寻找的倒数第K个结点2.也可以用栈,直接POPk就行了,但是效率太低了解决方案:提示:这里填写该问题的具体解决方案:/** * Definition for singly-linked list. * struct ListNode { *原创 2021-10-16 16:56:52 · 203 阅读 · 0 评论 -
面试题06. 从尾到头打印链表
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。原因分析:提示:这里填写问题的分析:用动态数组来存储反转的链表数据,先求出长度,然后从大到小的标号存储数据即可从尾到头看到这个我们也应该相等栈的特性,先进后出,这道题也可以用栈来存储数据,然后再存储在数组中解决方案:提示:这里填写该问题的具体解决方案:/** * Definition for singly-linked原创 2021-10-16 16:38:28 · 81 阅读 · 0 评论 -
二进制链表转整数
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。原因分析:提示:这里填写问题的分析:从十进制----->二进制5÷2=2余12÷2=1余01÷2=0余1===> 得出二进制 101 .反推回去 商 x 除数 + 余数=> 0 x 2 + 1 = 1->原创 2021-10-16 13:55:13 · 421 阅读 · 0 评论 -
链表的中间结点
项目场景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。原因分析:提示:这里填写问题的分析:1.最容易想打到的就是先遍历链表求出长度,根据链表的长度的奇偶性来找中间结点2.快慢指针法这是1的优化,两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间也可以数组来做,将链表中的原创 2021-10-16 13:32:35 · 114 阅读 · 0 评论 -
234.回文链表
项目场景:提示:这里简述项目相关背景:链表基础题问题描述:提示:这里描述项目中遇到的问题:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。原因分析:提示:这里填写问题的分析:我相信如果是判断字符串是不是回文字符串,都会想到可以用下标或者双指针,在两端分别向中间遍历,若相等,则是回文字符串。但是,这里是单链表,只能向一端遍历,因此,我们要想办法把链表里面的值的取出来放到一个顺序表中,所有遍历单链表,在遍历的同时依次把原创 2021-10-15 19:36:43 · 81 阅读 · 0 评论 -
160.相交链表
项目场景:提示:这里简述项目相关背景:链表基础练习题问题描述:提示:这里描述项目中遇到的问题:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:原因分析:提示:这里填写问题的分析:双指针:只有当链表headA 和headB 都不为空时,两个链表才可能相交。因此首先判断链表 headA 和headB 是否为空,如果其中至少有一个链表为空,则两个链表一定不相交,返回原创 2021-10-15 19:02:18 · 100 阅读 · 0 评论 -
删除链表中的节点
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。原因分析:提示:这里填写问题的分析:刚开始看到题目就感觉怪怪的,因为这道题目没有传入头指针,只传了一个要删除的结点从链表里删除一个节点 node 的最常见方法是修改之前节点的 next 指针,使其指向之后的节点,但是,无法访问想要删除的节点 之前 的节点,我们始终不能修改该节点的 next 指针原创 2021-10-15 16:09:43 · 132 阅读 · 0 评论 -
141.环形链表
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。原因分析:原创 2021-10-15 14:53:11 · 85 阅读 · 0 评论 -
移除链表元素
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。原因分析:提示:这里填写问题的分析:虚拟节点:解决方案:提示:这里填写该问题的具体解决方案:/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2021-10-14 23:27:15 · 117 阅读 · 0 评论 -
反转链表
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。原因分析:提示:这里填写问题的分析:双指针:引入三个指针,L指向第一个结点,R指向第二个结点,temp(暂存未反转的链表部分的头结点)指向R后一个结点,当R不为空时,就修改1,2结点的指针指向,R->next=L,然后依次移动三个指针,直到退出循环,L就是反转链表的头指针。解决方案:提示:这里填写该问题的具体解决方案:原创 2021-10-14 22:48:47 · 116 阅读 · 0 评论 -
合并两个有序链表
项目场景:链表练习题问题描述:提示:这里描述项目中遇到的问题:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。原因分析:提示:这里填写问题的分析:解决方案:提示:这里填写该问题的具体解决方案:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */s原创 2021-10-14 18:08:32 · 83 阅读 · 0 评论 -
删除排序链表中重复元素
项目场景:提示:这里简述项目相关背景:链表练习题问题描述:提示:这里描述项目中遇到的问题:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2: 输入: 1->1->2->3->3输出: 1->2->3原因分析:提示:这里填写问题的分析:1.双指针,引入两个指针,始终保证一前一后,由于这是一个升序的链表,要出现重复元素,必然相邻,如果相邻的结点相等则删除前原创 2021-10-13 22:39:33 · 1786 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点(c/c++)
项目场景:提示:这里简述项目相关背景:数据结构练习题问题描述:提示:这里描述项目中遇到的问题:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,原创 2021-10-13 21:13:54 · 290 阅读 · 0 评论