![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
经典
碎花喵
这个作者很懒,什么都没留下…
展开
-
子数组的最大累加和(简单但想不到)也是容许变小但保存最大值
描述给定一个数组arr,返回子数组的最大累加和例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.题目保证没有全为负数的数据[要求]时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)示例1class Solution {public: /** * max sum of the subarray * @param arr int整型vector the array原创 2021-08-19 17:09:19 · 109 阅读 · 0 评论 -
分割字符串--回溯法经典应用
分割回文串分割回文串给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: "aab"输出:[ ["aa","b"], ["a","a","b"]]class Solution {public: vector<vector<string>> partition(string s) { vector<vector<string>> result;..原创 2020-10-10 12:54:22 · 254 阅读 · 0 评论 -
二叉树的所有路径(自己想的回溯解决,通常说用dfs一样)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} *原创 2021-07-26 14:14:19 · 171 阅读 · 0 评论 -
平衡二叉树的判断(哈哈哈哈自己写的,cool,先写一次的条件,不直接返回true再直接返回往下的)
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true示例 2:输入:root = [1,2,2,3,3,null,null,4,4]输出:false示例 3:输入:root = []输出:true提示:树中的节点数在范围 [0, 5000] 内-104 <= Node.val <= 1原创 2021-07-26 13:44:23 · 123 阅读 · 0 评论 -
翻转二叉树(和比较值无关的时候就不用判断左右子树是否为NULL)
翻转一棵二叉树。示例:输入:输出:而且至少要把最关键的那一步做了。再递归。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) :原创 2021-07-23 09:38:07 · 67 阅读 · 0 评论 -
后序遍历(迭代版)
给定一个二叉树,返回它的 后序 遍历。示例:进阶: 递归算法很简单,你可以通过迭代算法完成吗?解:while( 栈非空){if( p 非空){}else{}}/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(null原创 2021-07-22 13:48:56 · 1022 阅读 · 0 评论 -
对称二叉树(看图,不是简单一个左右子树的比较,而是实际上涉及两棵树,但也要从当做只有三个节点开始看)
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullpt原创 2021-07-22 09:49:58 · 71 阅读 · 0 评论 -
二叉树的最小深度(比最大复杂一点因为需要忽略空节点,不忽略的话会算进去就变成最小了+深度指的是到根节点,而不是到空节点的距离)
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5提示:树中节点数的范围在 [0, 105] 内-1000 <= Node.val <= 1000/** * Definition for a binary tree原创 2021-07-21 17:35:49 · 87 阅读 · 0 评论 -
路径总和(一遍过,稍微想一下即可)
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true示例 2:输入:root = [1,2,3], targetSum = 5输出:false示例 3:输入:root = [原创 2021-07-21 17:32:52 · 61 阅读 · 0 评论 -
快排用随机
给你一个整数数组nums,请你将该数组升序排列。示例 1:输入:nums = [5,2,3,1]输出:[1,2,3,5]示例 2:输入:nums = [5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:1 <= nums.length <= 50000-50000 <= nums[i] <= 50000class Solution {public: vector<int> sortArray(vector...原创 2021-06-10 18:43:43 · 75 阅读 · 0 评论 -
数组中的第K个最大元素(快排和堆排两种递归方式实现)
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。①快排。写出快排后再修改,一次过。class Solution {public: int findKthLargest(vec.原创 2021-06-10 11:24:50 · 205 阅读 · 0 评论 -
栈的压入、弹出序列(留存,理解之后代码很好写)
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入复制[1,2,3,4,5],[4,3,5,1,2]返回值复制false思路:每次入栈一个元素后,都要判断一下栈顶元素是不是当前出栈序列 popSeque原创 2021-04-09 13:44:06 · 121 阅读 · 0 评论 -
用两个栈实现队列(留存,自己过,注意把2出完再说)
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。自己过,背:class Solution{public: void push(int node) { stack1.push(node); } int pop() { int res; if(stack2.empty()) { while(!stack1.empty())原创 2021-04-07 17:14:09 · 50 阅读 · 0 评论 -
删除链表中重复的节点(二刷二刷,经典,递归实现,看代码更清晰)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5示例1输入复制{1,2,3,3,4,4,5}返回值复制{1,2,5}每次删除头上的或者返回头:(看代码更清晰)/*struct ListNode { int val; struct ListNode *next;原创 2021-04-06 20:34:52 · 140 阅读 · 0 评论 -
两个链表的第一个公共节点(理解之后自写,简洁,一遍过)
题目描述输入两个链表,找出它们的第一个公共结点。解题思路:设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。非常简洁:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNo原创 2021-04-06 20:17:11 · 75 阅读 · 0 评论 -
反转链表(更新我更喜欢的命名方法)
题目描述输入一个链表,反转链表后,输出新链表的表头。示例1输入复制{1,2,3}返回值复制{3,2,1}/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead) {原创 2021-04-06 20:01:33 · 95 阅读 · 0 评论 -
二叉树的最近公共祖先
前文:二叉搜索树的最近公共祖先当然也能用本文的方法直接解。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1Output: 3Explanation: The LCA of n.原创 2021-04-06 19:48:02 · 59 阅读 · 0 评论 -
二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6解释:...原创 2021-04-06 19:39:47 · 137 阅读 · 0 评论 -
链表中环的入口节点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。分为两步:①如何判断有环的存在?在追及问题中,我们可以用两个速度不同的物体从同一地点出发,如果相遇则证明存在环(可用反证法证明,若不存在环,则速度不同的物体从同一地点出发则一定不会相遇),因此可以类比过来,定义两个指针fast、slow,令两指针以不同速度向后指,则相遇时证明有环存在,若fast指向NULL,则不存在环。②怎么找到环的入口结点?首先说方法:在问题一中两指针相遇后,让一个指针从头结点开始,另一原创 2021-04-06 19:34:36 · 112 阅读 · 0 评论 -
链表倒数第k个节点(留存。问题简单但奇怪,这编译器好像有问题)
题目描述输入一个链表,输出该链表中倒数第k个结点。示例1输入复制1,{1,2,3,4,5}返回值复制{5}/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(ListNode* pListHead, un原创 2021-04-06 19:16:00 · 32 阅读 · 0 评论 -
从尾到头打印单链表并存起来(递归
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。示例1输入复制{67,0,24,58}返回值复制[58,24,0,67]简洁写法:/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*/原创 2021-04-06 18:39:04 · 46 阅读 · 0 评论 -
平衡二叉树的判断(一路做下来一遍过,用到前面判断二叉树高度的一句递归)
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。示例1输入复制{1,2,3,4,5,6,7}返回值复制true自写法,一遍过:class Solution {public: bool IsBalanced_Solutio原创 2021-04-04 20:11:08 · 87 阅读 · 0 评论 -
【经典】二叉树深度(一句话)
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。示例1输入复制{1,2,3,4,5,#,6,#,#,7}返回值复制4(我)①想到层次遍历,每进入一层就count++,代码长。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : v.原创 2021-04-04 19:45:18 · 64 阅读 · 0 评论 -
二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。示例1输入复制{5,3,7,2,4,6,8},3返回值复制{4}说明按结点数值大小顺序第三小结点的值为4 ①我写的需要多一个内存的:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : va原创 2021-04-04 19:15:13 · 83 阅读 · 0 评论 -
二叉搜索树转双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题意简单例子图示:看这个例子涵盖情况较多:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solut..原创 2021-04-04 18:23:31 · 1120 阅读 · 0 评论 -
二叉树中和为某一值的路径(回溯法void backtracking(vector<vector<int>>&res;vector<int> middle;))
题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例1输入复制{10,5,12,4,7},22返回值复制[[10,5,7],[10,12]]示例2输入复制{10,5,12,4,7},15返回值复制[]/*struct TreeNode { int val; struct TreeNode *left; s.原创 2021-04-04 16:57:07 · 139 阅读 · 0 评论 -
二叉搜索数的后序遍历序列(对后续遍历的理解不深)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)示例1输入复制[4,8,6,12,16,14,10]返回值复制true注意看注释: //序列最后一个元素是根节点,而二叉搜索树的根节点左边的序列值比根小,右边的比根大。 //根据这个特性,将序列分为两半,左边序列的值比根节点小,右边序列的值比根节点...原创 2021-04-04 16:28:27 · 107 阅读 · 0 评论 -
按之字形顺序打印二叉树(易错)(因为到了只变一下,整体的还是原来的那棵树的进入顺序,直接改变原来的进入顺序会乱)
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。示例1输入复制{8,6,10,5,7,9,11}返回值复制[[8],[10,6],[5,7,9,11]]分析:(易错)(因为到了只变一下,整体的还是原来的那棵树的进入顺序,直接改变原来的进入顺序会乱)直接改变原来的进入顺序会错误打印成[[8],[10,6],[9,11,5,7]]。可以引入一个count变量原创 2021-04-04 12:24:16 · 64 阅读 · 0 评论 -
把二叉树打印成多行(带层次的BFS,代码在while基础上加个for)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。示例1输入复制{8,6,10,5,7,9,11}返回值复制[[8],[6,10],[5,7,9,11]]自己写:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL)原创 2021-04-04 11:49:49 · 58 阅读 · 0 评论 -
从上往下打印二叉树(BFS一遍过)
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入复制{5,4,#,3,#,2,#,1}返回值复制[5,4,3,2,1]/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {pub原创 2021-04-04 11:32:50 · 138 阅读 · 0 评论 -
对称的二叉树(对称:与自己的镜像二叉树相同)
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1输入复制{8,6,6,5,7,7,5}返回值复制true示例2输入复制{8,6,9,5,7,7,5}返回值复制false/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre原创 2021-04-04 11:31:08 · 98 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入复制{8,8,#,9,#,2,#,5},{8,9,#,2}返回值复制true淘汰:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }原创 2021-04-01 22:37:36 · 50 阅读 · 0 评论 -
(自己写,规范)根据前序遍历和中序遍历重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。示例1输入复制[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值复制{1,2,5,3,4,6,7}/** * Definition for binary tree * struct TreeNode {原创 2021-04-01 19:40:31 · 74 阅读 · 0 评论 -
构建乘积数组
题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。示例1输入复制[1,2,3,4,5]返回值复制原创 2021-03-30 23:05:47 · 48 阅读 · 0 评论 -
动态规划找第i个丑数(不是判断)
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。示例1输入复制7返回值复制8class Solution {public: int GetUglyNumber_Solution(int index) { //dp[index]. //因此,dp[i]表示第i个丑数,它的值不...原创 2021-03-30 22:10:15 · 90 阅读 · 0 评论 -
丑数
编写一个程序判断给定的数是否为丑数。丑数就是只包含质因数 2, 3, 5 的正整数。示例 1:输入: 6输出: true解释: 6 = 2 × 3示例 2:输入: 8输出: true解释: 8 = 2 × 2 × 2示例 3:输入: 14输出: false解释: 14 不是丑数,因为它包含了另外一个质因数 7。说明: 1 是丑数。 输入不会超过 32 位有符号整数的范围: [−231, 231 − 1]。class Solution...原创 2021-03-30 20:52:55 · 55 阅读 · 0 评论 -
整数拆分(割绳子)
给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 ×3 ×4 = 36。说明: 你可以假设n不小于 2 且不大于 58。class Solution {public: int integerBreak(int n) { if(n&...原创 2021-03-24 21:42:47 · 86 阅读 · 0 评论 -
旋转数组
给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为O(1) 的原地算法解决这个问题吗?示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]...转载 2021-03-22 19:04:07 · 40 阅读 · 0 评论