![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode刷题
Jasscical
github:github网址/jasscical
gitee:gitee网址/jasscical/
记录个人学习经历,积少成多,水到渠成。
展开
-
(字符串_01)字符串转整数
剑指 Offer 67. 把字符串转换成整数问题复盘:我在拼接数字(我用的权重pow,传入当前的位置)以及数组是否越界那部分卡壳 了,。还有就是判断是否是数字的函数isdigit用法也模糊。用的少就不清晰。以及整体做题时间太长,以后若是超过30小时没写完个大致就直接题解。class Solution {public: int strToInt(string str) { int i = 0, isNegative = 1; while(..原创 2021-01-15 11:41:01 · 517 阅读 · 0 评论 -
(位运算_01)
2021.1.1,新年第一个博客,哈哈哈哈!!!位运算的一些知识:n & n-1 : 将n的二进制数中最右边的 1 设置成 0x & (-x) : 获取二进制中最右边的 1n & 1 = 0 : 则 n二进制 最右一位 为 0n & 1 = 1 : 则 n 二进制 最右一位 为 1231. 2的幂难度简单266给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例1:输入: 1输出: true解释: 20= 1...原创 2021-01-01 21:36:37 · 147 阅读 · 0 评论 -
(链表_02)环形链表(是否有换\环形链表入口)
141. 环形链表142. 环形链表 II解题思路链表是否有环```cpp []//快慢指针1:推荐这种,简洁好理解,第二种不好理解class Solution {public: bool hasCycle(ListNode *head) { if(!head || !head->next) return false; ListNode* fast = head; ListNode* slow = head; wh原创 2020-11-19 09:02:24 · 102 阅读 · 0 评论 -
(链表_01)回文链表(快慢指针、栈、数组)
解题思路快慢指针的话就是每次快指针走两步,慢指针走一步,这里要注意循环的条件。当走完后,slow会在中点的位置。要根据节点的奇偶,来决定中点的位置作者:jasscical链接:https://leetcode-cn.com/problems/palindrome-linked-list/solution/234hui-wen-lian-biao-kuai-man-zhi-zhen-zhan-shu-zu/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非...原创 2020-11-17 16:54:07 · 129 阅读 · 0 评论 -
(回溯_04)组合总和
39. 组合总和解题思路参考代码随想录1.跟之前组合求和不同的一点是这里允许同一个数字使用多次,在代码中递归中有体现。2.for循环是从选择集中遍历所有元素选择元素;处理过程是对sum求和、path添加元素;递归是往深度探索;回溯与处理过程一一对应。3.这里一个剪枝操作是在for循环的条件语句中加的预判断,如果sum加上当前位置对应的候选元素小于等于目标值target,则需要进行处理递归回溯操作,否则没必要进行。作者:jasscical链接:https://leet.原创 2020-11-02 16:20:11 · 140 阅读 · 0 评论 -
(回溯_03)求电话号码的组合
17. 电话号码的字母组合解题思路:参考代码随想录,其他见注释class Solution {public: const string letterMap[10] ={ //各个数字对应的字母集合,用下标对应。 "", // 0 "", // 1 "abc", // 2 "def", // 3 "ghi", // 4 "jkl", // 5 "mno", // 6.原创 2020-10-31 13:33:47 · 130 阅读 · 0 评论 -
(回溯_02)组合求和
216. 组合总和 III77. 组合找出所有相加之和为n 的k个数的组合。组合中只允许含有 1 -9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]解题思路代码随想录结合77题求组合那题,这题的话是加了一个总和的限制。回...原创 2020-10-29 20:17:36 · 298 阅读 · 0 评论 -
(回溯_01)组合
77. 组合给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。示例:输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]解题思路代码随想录回溯三部曲:1.递归函数返回类型和传入参数2.回溯终止条件3.单层搜索的逻辑class Solution {public: vector<vector<int>> ...原创 2020-10-27 20:50:38 · 127 阅读 · 0 评论 -
(树_25)将二叉搜索树变成累加树
538. 把二叉搜索树转换为累加树给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node的新值等于原树中大于或等于node.val的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。解题思路参考代码随想录首先理解累加树的概念:看题目中的示例1,从右子树开始看,最右8(8),然后7...原创 2020-10-24 19:53:11 · 226 阅读 · 0 评论 -
(树_24)108.将有序数组构造二叉搜索树BST
108. 将有序数组转换为二叉搜索树难度简单621将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5解题思路参考:代码随想录可以回忆一.原创 2020-10-23 21:12:01 · 297 阅读 · 0 评论 -
(树_23)修剪二叉搜索树
669. 修剪二叉搜索树给定一个二叉搜索树,同时给定最小边界L和最大边界R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。示例 1:输入: 1 / \ 0 2 L = 1 R = 2输出: 1 \ 2示例 2:输入: 3 / \ 0 4 \ 2 / 1 L...原创 2020-10-23 20:03:58 · 96 阅读 · 0 评论 -
(树_22)删除BST中某个节点值为key的
450. 删除二叉搜索树中的节点代码随想录力扣传送门解题思路分5种情况,第一种是翻个底朝天都找不到node-val==key的,说明删除不了,返回空指针。第2、3、4、5种情况是找到了node->val == key的,那么根据节点的左右孩子是否存在进行了讨论。最复杂的是左右孩子都不为空的。需要将节点的左孩子,放到节点的右孩子的最左边(所以先要找到这个最左孩子),作为左孩子(这段结合Carl的图自己画画就直观了)。后面的就是node->val跟key的比较,然后用左孩子或.原创 2020-10-22 00:26:30 · 136 阅读 · 0 评论 -
(树_21)在BST中插入一个值
701. 二叉搜索树中的插入操作给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和 插入的值: 5你可以返回这个二叉搜索树: ...原创 2020-10-21 19:52:41 · 415 阅读 · 0 评论 -
(树_20)求二叉(搜索)树的最小公共祖先
235. 二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 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 = ...原创 2020-10-19 23:59:26 · 1185 阅读 · 0 评论 -
(树_19)求BST中的众数
501. 二叉搜索树中的众数给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当前结点的值 左子树和右子树都是二叉搜索树例如:给定 BST[1,null,2,2], 1 \ 2 / 2返回[2].解题思路:参考代码随想录三种方式:第一种map+vector+中序可以求...原创 2020-10-16 23:30:20 · 116 阅读 · 0 评论 -
(树_18)求二叉搜索树最小绝对差
530. 二叉搜索树的最小绝对差解题思路参考(代码随想录)跟(98.判断是否为BST、二叉树遍历方法、验证二叉搜索树)类似的解法只要是BST,中序都可以看成是一个有序递增的数组。 INT_MAX是整数类型最大值,INT_MIN是整数类型最小值,代码有注释为何要使用最大值 三种方式:vector套路、递归(用一个pre保存上一个节点)、迭代法(模拟递归,跟98题结构类似,掌握这种套路)```cpp []/**BST套路:递归加进vector看成有序数组 * Def..原创 2020-10-15 21:47:40 · 117 阅读 · 0 评论 -
(树_17)树的前中后序遍历以及统一写法
参考:代码随想录、统一写法144. 二叉树的前序遍历145. 二叉树的后序遍历94. 二叉树的中序遍历/**前序遍历 * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };原创 2020-10-14 15:04:34 · 155 阅读 · 0 评论 -
(树_16)验证是否是BST
解题思路:四种方式,都是用到中序(BST为递增序列):将所有节点值放入vector,然后判断是否为递增序列 设置一个最小值maxVal,遍历左右子树,处理中间节点时,符合当前节点值大于maxVal值,要不断更新maxVal值,不符合直接返回false 设置一个指针保存上一个节点,然后处理中间节点与第二个方式类似,注意一下判断的条件 迭代法:模拟中序递归,不太好写 ```cpp []/**中序将各节点值放入vector,判断是否为递增序列 * Definitio...原创 2020-10-14 14:36:03 · 145 阅读 · 0 评论 -
(树_15)二叉搜索树中搜索给定的值
700. 二叉搜索树中的搜索难度简单93给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和值: 2你应该返回如下子树: 2 / \ 1 3在上述示例中,如果要找的值是5,但因为没有节点值为...原创 2020-10-13 22:28:35 · 348 阅读 · 0 评论 -
(树_14)合并二叉树
617. 合并二叉树难度简单548给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点。示例1:输入: Tree 1 Tree 2 1 2 ..原创 2020-10-12 22:57:19 · 141 阅读 · 0 评论 -
(树_13)构造二叉树
106. 从中序与后序遍历序列构造二叉树参考资料:代码随想录解题思路后序:左右中中序:左中右分为以下几步:1.后序、中序是否为空,为空直接返回空树,否则进入后续步骤2.获取后序最后一个元素,作为根节点3.由后序最后一个元素在中序里找到分割点delimiter4.由分割点对中序进行分割成子序列:左中序,右中序5.然后对后序进行分割成子序列:左后序,右后序(需要借助左中序来判断分割点位置,详情看代码注释)6.递归构造左子树,右子树...原创 2020-10-11 22:06:35 · 246 阅读 · 0 评论 -
(树_12)树最左下角的值
513. 找树左下角的值解题思路参照代码随想录这题用层次遍历最好理解,递归用到回溯不太好理解```cpp []/**层次遍历 * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}原创 2020-10-07 23:18:00 · 105 阅读 · 0 评论 -
(树_11)求二叉树的所有节点个数
222. 完全二叉树的节点个数难度中等248给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~2h个节点。示例:输入: 1 / \ 2 3 / \ /4 5 6输出: 6解题思路:代码随想录/**迭代法:层次遍历 * Definition for a bi..原创 2020-10-01 21:03:56 · 3023 阅读 · 0 评论 -
(树_10)求最小深度
111. 二叉树的最小深度代码随想录给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2./**递归 * Definition for a binary tree node. * struct TreeNode { * ...原创 2020-09-30 23:58:49 · 2194 阅读 · 0 评论 -
(树_09)对称二叉树、相同的树
这位大佬写的很好一、递归三部曲:1.确定参数列表和返回类型2.确定递归终止条件3.确定单层递归的逻辑二、迭代外侧跟内侧相比较,模拟递归的过程101. 对称二叉树给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2/ \ / \3 4 4 3但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2...原创 2020-09-28 23:38:51 · 64 阅读 · 0 评论 -
(树_08)翻转二叉树
226. 翻转二叉树6种写法这里推荐层次遍历、模板写法(不好理解,但其实好套用)层次遍历写法/**层次遍历的方式:翻转二叉树 * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} *原创 2020-09-26 22:16:56 · 81 阅读 · 0 评论 -
(树_07)前中后序遍历二叉树
144. 二叉树的前序遍历难度中等368给定一个二叉树,返回它的前序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]94. 二叉树的中序遍历难度中等720给定一个二叉树,返回它的中序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,3,2]145. 二叉树的后序遍历难度中等399给定一个二...原创 2020-09-22 21:20:23 · 79 阅读 · 0 评论 -
(数组_双指针法)移除数组中给定元素
27. 移除元素难度简单653给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。...原创 2020-09-20 20:23:45 · 275 阅读 · 0 评论 -
(队列_01)小顶堆 前K个高频元素
347. 前 K 个高频元素难度中等519给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]解题思路今天学习了之前听过的小顶堆、大顶堆,简单理解是每次动态维护K个元素,这K个元素在顶堆里面会自动进行排序。小顶堆的话会每次弹出K个中最小的元素,最后堆中剩下的是K个最大的元素。大顶堆的话每...原创 2020-09-19 11:19:06 · 137 阅读 · 0 评论 -
(数组_单调队列)滑动窗口的最大值
剑指 Offer 59 - I. 滑动窗口的最大值难度简单113给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3 -1 ...原创 2020-09-18 11:02:22 · 235 阅读 · 0 评论 -
(树_06)打印二叉树的所有路径
257. 二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:输入: 1/ \2 3\ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3解题思路用两个队列,一个存放树节点node_queue,一个存放到当前节点的路径path_queue每次取出两个队列的队首,判断当前节...原创 2020-09-17 16:37:05 · 485 阅读 · 0 评论 -
(树_05)最小高度树或将有序数组转化为二叉搜索树(BST)
108. 将有序数组转换为二叉搜索树将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /-10 5解题思路中序遍历,选择任意一个中间位置数字作为根节点因为...原创 2020-09-17 13:58:18 · 89 阅读 · 0 评论 -
(树_04)第K个大数
解题思路中序遍历得到的为递增的序列,返回 序列长度-k 即为结果体会:中序遍历还有这样的应用,读书还是得结合实际操作一下才知道啊```cpp/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL),...原创 2020-09-15 15:42:35 · 57 阅读 · 0 评论 -
(树_03)判断是否为AVL树
110. 平衡二叉树解题思路1.根节点为空2.一个求各节点高度(深度)的函数height(Treenode*node),就是之前求节点最大深度那个代码3.当前节点左右孩子高度差不超过1,而且它的子节点也符合这样的规则,那么这就是一颗AVL树class Solution {public: int height(TreeNode* node) { return node == nullptr ? 0 : max(height(node->le..原创 2020-09-12 11:03:03 · 461 阅读 · 0 评论 -
(树_02)求树的最小深度
解题思路dfs:if条件判断1.根节点为空2.左右孩子为空3.左孩子不为空:递归调用minDepth,把左孩子节点传入,跟depth比较,取两者更小的那个4.右孩子不为空:递归调用minDepth,把右孩子节点传入,跟depth比较,取两者更小的那个class Solution {public: int minDepth(TreeNode* root) { if(root == nullptr) return 0; if(roo...原创 2020-09-12 10:28:53 · 225 阅读 · 0 评论 -
(树)二叉树的遍历
107. 二叉树的层次遍历 II给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[ [15,7], [9,20], [3]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-...原创 2020-09-10 10:35:45 · 95 阅读 · 0 评论 -
(二分查找_01)搜索插入位置
35. 搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例2:输入: [1,3,5,6], 2输出: 1来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/search-insert-position著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注.原创 2020-08-10 10:53:11 · 151 阅读 · 0 评论 -
(栈_03)两个队列实现栈
225. 用队列实现栈解题思路之前写两个栈实现一个队列:一个栈用于模拟队列添加元素,另一个栈用于模拟队列删除元素或者获取队头元素。这其实就是根据两个数据结构的差异来实现对应的功能然后写这个队列模拟栈。首先我是这样想的:假如有一个栈1-2-3,队列只需将元素一次push就行1-2-3如果你需要获取栈顶元素3,那么就对应队列获取队尾,队列的特性是先进先出,即先出1再2再3,。然后我这里想的是用队列的size()操作。采用一个count记录队列元素个数以及一个临时队列tem...原创 2020-08-04 12:21:53 · 147 阅读 · 0 评论 -
(栈_02)O(1)求栈最小元素
155. 最小栈设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop()—— 删除栈顶的元素。top()—— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,nu...原创 2020-08-03 16:07:11 · 303 阅读 · 0 评论 -
(栈_01) 用两个栈模拟一个队列的操作
面试题 03.04. 化栈为队难度简单17实现一个MyQueue类,该类用两个栈来实现一个队列。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false解题思路设置两个栈成员变量:s1,s2s1:对应队列的添加元素操作s2:对应队列的出列、队首操作..原创 2020-08-01 17:41:50 · 292 阅读 · 0 评论