LeetCode
文章平均质量分 52
刷题,题型总结
CodeLinghu
本职工作:软件开发工程师&&Java程序员
爱好:电子电路、AI、嵌入式
展开
-
【LeetCode 53】39.组合总和
【LeetCode 53】39.组合总和文章目录【LeetCode 53】39.组合总和一、题意二、解答过程一、题意二、解答过程回溯三部曲:确定参数确定终止条件确定单层递归逻辑class Solution {private: vector<vector<int>>result; vector<int> path; void backtracking(vector<int>&candidates,int原创 2022-02-20 18:08:22 · 322 阅读 · 0 评论 -
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合文章目录【LeetCode 52】17.电话号码的字母组合一、题意二、解答过程一、题意二、解答过程理解本题后,要解决如下三个问题:数字和字母如何映射==用 map或者二维数组即可两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来==回溯算法可解决n个for循环的问题输入1 * #按键等等异常情况回溯三部曲:确定参数确定终止条件确定单层递归逻辑class Solution {privat原创 2022-02-20 11:21:54 · 6848 阅读 · 0 评论 -
【LeetCode 51】216.组合总和III
【LeetCode 51】216.组合总和III文章目录【LeetCode 51】216.组合总和III一、题意二、解答过程一、题意二、解答过程这道题和 《77.组合》比起来,就是多了一些限制条件,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,…9]图中可以看出,只有取集合红色的是满足条件的。回溯三部曲class Solution {private: vector<vector<int>>result;//存放结果集 ve原创 2022-02-19 17:08:04 · 7715 阅读 · 0 评论 -
【LeetCode 50】77.组合(优化、剪枝操作)
【LeetCode 50】77.组合(优化)文章目录【LeetCode 50】77.组合(优化)一、题意二、解答过程一、题意二、解答过程组合问题的优化其实就是剪枝!具体怎么剪枝呢?可以剪枝的地方就在递归中每一层的for循环所选择的起始位置。如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。代码中i就是for循环里选择的起始位置:for(int i=startIndex;i<=n;i++){优化过程:已经选择的元素个数:pat原创 2022-02-19 11:22:01 · 579 阅读 · 0 评论 -
【LeetCode 49】77.组合
【LeetCode 49】77.组合文章目录【LeetCode 49】77.组合一、题意二、解答过程一、题意二、解答过程一维数组path用来存放结果集合------[1,2] [1,3] [1,4]。二维数组 result用来存放统一的结果集合------[[1,2] [1,3] [1,4]]。用到回溯三部曲class Solution {private: vector<vector<int>> result; // 存放符合条件结果的集合 v原创 2022-02-19 10:25:53 · 7117 阅读 · 0 评论 -
第七章 回溯算法理论基础
第七章 回溯算法理论基础文章目录第七章 回溯算法理论基础一、定义1.1回溯的效率1.2回溯法的理解二、回溯法的模板一、定义回溯法也可以叫做回溯搜索法,是一种搜索方式。回溯和递归是孪生兄弟,同出同没。 回溯=递归1.1回溯的效率回溯的效率并不高,本质是一个枚举,之所以学它,是因为某些场合下必须用回溯法解决问题。回溯可以解决如下的问题:组合问题【N个数里面按一定规则找出k个数的集合】切割问题【一个字符串按一定规则有几种切割方式】子集问题【一个N个数的集合里有多少符合条件的子集】排原创 2022-02-18 00:31:52 · 256 阅读 · 0 评论 -
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树文章目录【LeetCode 48】108.将有序数组转换为二叉搜索树一、题意二、解答过程一、题意二、解答过程有序数组在构造二叉搜索树的时候,当前节点0一定是处于数组中间位置的。0的左边和右边分别对应二叉树左右子树,分别进行处理即可。class Solution {public: TreeNode* traversal(vector<int>& nums,int left,int right) {原创 2022-02-17 18:27:27 · 208 阅读 · 0 评论 -
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树文章目录【LeetCode 47】669.修剪二叉搜索树一、题意二、解答过程一、题意二、解答过程class Solution {public: TreeNode* trimBST(TreeNode* root, int low, int high) { if(root==NULL) return NULL; //当前节点的元素小于low,去寻找右子树,返回右子树符合条件的节点原创 2022-02-17 17:13:01 · 142 阅读 · 0 评论 -
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点文章目录【LeetCode 46】450.删除二叉搜索树的节点一、题意二、解答过程一、题意二、解答过程二叉搜索树的删除要比插入困难,复杂。同样需要递归!二叉搜索树删除情况有五种:没找到删除的节点,遍历到空节点直接返回了找到删除的节点第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点第四种情况:删除节点的右孩子为空,左原创 2022-02-16 22:06:42 · 232 阅读 · 0 评论 -
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作文章目录【LeetCode 45】701.二叉搜索树中的插入操作一、题意二、解答过程一、题意二、解答过程在二叉搜索树中插入节点,只需要遍历二叉搜索树即可,不需要改变它的结构,遍历当然用到递归!class Solution {public://1. TreeNode* insertIntoBST(TreeNode* root, int val) { //2. if(root==NULL)原创 2022-02-16 15:34:13 · 105 阅读 · 0 评论 -
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先文章目录【LeetCode 44】235.二叉搜索树的最近公共祖先一、题意二、解答过程一、题意二、解答过程与 《二叉树的最近公共祖先》不同,普通二叉树求最近公共祖先需要利用回溯自底向上查找公共节点,而二叉搜索树就不用了,因为二叉搜索树是有序的(相当于自带方向),只要自上而下遍历二叉搜索树即可。可以采用前序遍历(中-左-右)。遍历二叉搜索树的过程就是:需找区间[p->val,q->val];如果cur节点在[p->val原创 2022-02-16 11:48:52 · 468 阅读 · 0 评论 -
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先文章目录【LeetCode 43】236.二叉树的最近公共祖先一、题意二、解答过程一、题意二、解答过程**思路/方法:**该题用到自底向上查找------回溯!还要用到递归!如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。使用后序遍历,回溯过程,就是从低向上遍历节点,一旦发现这个条件的节点,就是最近公共节点。先找节点路径p和q在结点路径的最近原创 2022-02-15 15:13:28 · 344 阅读 · 0 评论 -
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数文章目录【LeetCode 42】501.二叉搜索树中的众数一、题意二、解答过程一、题意二、解答过程在 《二叉树:搜索树的最小绝对值差》中我们用到了 pre指针和 cur指针的技巧。这里又用上了。弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。而且初始化时pre==NULL,这样当pre为NULL时,我们就知道这是比较的第一个元素。if (pre == NULL) { // 第一个节点 coun原创 2022-02-14 12:16:01 · 684 阅读 · 0 评论 -
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差文章目录【LeetCode 41】530.二叉搜索树的最小绝对差一、题意二、思考过程一、题意二、思考过程在对二叉搜索树进行中序遍历的过程中,我们可以直接找到相邻两个节点的差值------用一个 pre节点记录 cur节点的前一个节点。cur:当前节点pre:当前节点的前一个节点class Solution {public: int result=INT_MAX; TreeNode* pre; void t原创 2022-02-12 16:47:08 · 531 阅读 · 0 评论 -
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树文章目录【LeetCode 40】98.验证二叉搜索树一、题意二、思考过程一、题意二、思考过程一棵二叉搜索树的特征如下:节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节点的数所有左子树和右子树自身必须也是二叉搜索树我们要比较的就是左子树所有节点小于中间节点,右子树所有节点大于中间节点。验证二叉搜索树就是相当于判断一个序列是不是递增,是不是中序遍历。class Solution {public: TreeNode原创 2022-02-12 16:01:52 · 96 阅读 · 0 评论 -
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索文章目录【LeetCode 39】700.二叉搜索树中的搜索一、题意二、解答过程一、题意二、解答过程二叉搜索树的定义是:它是有序树左子树值<根节点值右子树值>根节点值方法:采用递归!class Solution {public: //1 TreeNode* searchBST(TreeNode* root, int val) { //2. if(root==NULL||r原创 2022-02-12 11:29:36 · 202 阅读 · 0 评论 -
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树文章目录【LeetCode 38】617.合并二叉树一、题意二、解答过程一、题意二、解答过程**方法:**采用前序遍历+递归class Solution {public: //1.确定递归函数的参数和返回值 TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { //2.确定终止条件 if(root1==NULL) return root2;/原创 2022-02-12 11:09:41 · 96 阅读 · 0 评论 -
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树文章目录【LeetCode 37】106.从中序与后序遍历构造二叉树一、题意二、思考过程一、题意二、思考过程思路:以 后序数组的最后一个元素为切割点,先切割中序数组,根据中序数组,反过来切割后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。class Solution {private: TreeNode* traversal (vector<int>& inorder, vector<原创 2022-02-12 10:16:15 · 575 阅读 · 0 评论 -
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II文章目录【LeetCode 36】113.路径总和II一、题意二、思考过程一、题意二、思考过程路径总和II和I的区别就是:路径总和II要遍历整个树,找到所有路径,所以递归函数不要返回值。class Solution {public: vector<vector<int>> result; vector<int> path; //递归不需要返回值,因为我们要遍历整个树 void原创 2022-02-11 14:41:02 · 243 阅读 · 0 评论 -
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和文章目录【LeetCode 35】112.路径总和一、题意二、思考过程一、题意二、思考过程方法:递归+深度优先遍历 dfs。class Solution {private: //1. bool traversal(TreeNode* cur, int count) { //2. if (!cur->left && !cur->right && count ==原创 2022-02-11 10:21:18 · 173 阅读 · 0 评论 -
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径文章目录【LeetCode 34】257.二叉树的所有路径一、题意二、思考过程2.1递归三部曲:一、题意二、思考过程这道题涉及到两个概念:路径回溯需要用到的是 前序遍历,通过前序遍历,父节点到叶子节点之后形成路径,将每一条路径转换为串并存到结果集中result中,回溯以后再次重复形成其他路径,进入其他路径,path短暂存放这些路径元素,前序遍历以及回溯过程如下:我们先使用递归的方式做前序遍历,然后进行回溯!2.1递归三部曲:递归原创 2022-02-10 19:10:08 · 391 阅读 · 0 评论 -
【LeetCode 33】110.平衡二叉树
【LeetCode 33】110.平衡二叉树文章目录【LeetCode 33】110.平衡二叉树一、题意二、思路2.1递归法一、题意二、思路这道题需要用到二叉树高度这个概念,这里需要强调一下概念:二叉树节点的深度:指从根节点到该节点的最长简单路径边数的条数。二叉树节点的高度:指从 该节点到叶子节点的最长简单路径边的条数。2.1递归法同样是三部曲:这里用 -1来标记树不符合平衡树的规则。class Solution {public: //1.明确函数参数和返回值原创 2022-02-09 21:34:21 · 96 阅读 · 0 评论 -
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度文章目录【LeetCode 32】111.二叉树的最小深度一、题意二、思路2.1递归法一、题意二、思路这道题和之前求得 《104.二叉树的最大深度》不同,不同在逻辑处理上。注意这里的概念, **最小深度:**最是从根节点到最近叶子节点的最短路径上的节点数量。2.1递归法同样是三部曲:class Solution {public://1.确定函数参数和返回值 int getDepth(TreeNode *node) {原创 2022-02-09 12:43:27 · 502 阅读 · 0 评论 -
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度文章目录【LeetCode 31】104.二叉树的最大深度一、题意二、思考过程2.1递归法:一、题意二、思考过程**思路:**二叉树的最大深度就是根节点的高度。方法:求根节点的高度就是求后序遍历即可。2.1递归法:确定递归函数的参数和返回值int getDepth(TreeNode * node)确定终止条件if(node==NULL) return 0;确定单层递归逻辑确定单层递归的逻辑:先求它的左子树的深度,再求原创 2022-02-08 18:01:04 · 111 阅读 · 0 评论 -
【LeetCode 30】101.对称二叉树
【LeetCode 30】101.对称二叉树文章目录【LeetCode 30】101.对称二叉树一、题意二、思考过程2.1递归法一、题意二、思考过程**思路:**判断二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互反转的,理解这一点之后其实知道了要比较的是两棵树,所以在递归遍历的过程中要同时遍历这两棵树,然后比较这两棵树,比较的是 两棵树的里侧和外侧元素是否相等。2.1递归法递归法三部曲:确定递归函数的参数和返回值bool compare(TreeNode *left,Tr原创 2022-02-08 17:41:40 · 398 阅读 · 0 评论 -
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树文章目录【LeetCode 29】226.反转二叉树一、题意二、解答过程2.1递归法解答2.2迭代法解答2.2.1迭代法模拟层次遍历一、题意二、解答过程这道题的思路就是: 把每个节点的左右孩子交换一下即可。2.1递归法解答递归法的三部曲:确定递归函数的参数和返回值确定终止条件确定单层递归逻辑(采用前序遍历)class Solution {public: TreeNode* invertTree(TreeNode* root)原创 2022-02-08 13:09:05 · 100 阅读 · 0 评论 -
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历文章目录【LeetCode 28】102.二叉树的层序遍历一、题意二、解答过程学会二叉树的层序遍历,可以一口气打完以下十题:一、题意二、解答过程层序遍历需要借助一个辅助数据结构来实现------队列实现。队列先进先出,符合一层一层遍历的逻辑。class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { qu原创 2022-02-08 12:36:40 · 724 阅读 · 0 评论 -
6.2二叉树的迭代遍历
6.2二叉树的迭代遍历文章目录6.2二叉树的迭代遍历一、使用迭代法实现中序遍历二、使用迭代法实现前序遍历三、使用迭代法实现后序遍历在6.1中我们通过使用递归实现了二叉树的前、中、后序的遍历,本文将介绍使用迭代法实现二叉树前中后遍历,写出统一风格的代码。根本思想:将要访问的节点放入栈中,将要处理的节点放入栈中但是要做标记,即将要处理的节点放入栈中以后,紧接着放入一个空指针作为标记。这种方法也可以叫 标记法。一、使用迭代法实现中序遍历class Solution {public: vec原创 2022-02-08 01:05:58 · 184 阅读 · 0 评论 -
6.1二叉树的递归遍历
6.1二叉树的递归遍历文章目录6.1二叉树的递归遍历一、方法论二、前序遍历完整代码三、中序遍历完整代码四、后序遍历完整代码二叉树的递归遍历包括:前、后、中序遍历的递归写法。一、方法论递归算法三要素:确定递归函数的参数和返回值void traversal(TreeNode* cur, vector<int>& vec)//当前指针和数组确定终止条件if (cur == NULL) return;确定单层递归逻辑前序遍历是中->左->右的顺序,原创 2022-02-07 12:25:51 · 1031 阅读 · 0 评论 -
第六章 二叉树理论基础
第六章 二叉树理论基础文章目录第六章 二叉树理论基础一、二叉树分类二、二叉树的存储方式三、二叉树的遍历方式四、二叉树的定义一、二叉树分类二叉树的分类为:满二叉树如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。完全二叉树完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包原创 2022-02-06 19:20:36 · 335 阅读 · 0 评论 -
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素文章目录【LeetCode 27】347.前k个高频元素一、题意二、思考过程三、完整代码一、题意二、思考过程这道题主要涉及下面三个部分:统计元素出现的次数对次数排序(用堆实现)找出前k个高频元素Notes:我们要使用小顶堆统计最大的前k个元素三、完整代码class Solution {public: //小顶堆 class mycomparision{ public:原创 2022-02-05 12:54:40 · 1048 阅读 · 0 评论 -
【LeetCode 26】239.滑动窗口最大值
【LeetCode 26】239.滑动窗口最大值文章目录【LeetCode 26】239.滑动窗口最大值一、题意二、思考过程一、题意二、思考过程这是使用 单调队列的经典题目。**单调队列:**即单调递减或单调递增的队列。这个队列需要我们自己实现,可以用 deque 放进队列窗口的元素随着窗口的移动,队列一进一出,每次移动之后,队列告诉我们里面最大值是什么:class MyQueue {public: //滑动窗口中移除的元素数值 void pop(int value) {原创 2022-02-05 11:15:22 · 1100 阅读 · 0 评论 -
【LeetCode 25】150.逆波兰表达式求值
【LeetCode 25】150.逆波兰表达式求值文章目录【LeetCode 25】150.逆波兰表达式求值一、题意二、思考过程一、题意二、思考过程逆波兰表达式就是 一种后缀表达式。所谓后缀就是指运算符写在后面。逆波兰表达式主要有以下两个优点:去掉括号后表达式无歧义。适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行运算,并将结果压入栈中。其实逆波兰表达式相当于是二叉树中的后序遍历。进一步看,这道题就是一个相邻字符串消除(运算)的过程。class Solution原创 2022-02-04 01:21:53 · 585 阅读 · 0 评论 -
【LeetCode 25】20.有效的括号
【LeetCode 25】20.有效的括号文章目录【LeetCode 25】20.有效的括号一、题意二、思考过程三、完整代码一、题意二、思考过程括号匹配是使用栈解决的经典问题。就像我们在写代码的过程中,要求括号的顺序是一样的,有左括号,相应的位置必须要有右括号。字符串里的括号不匹配有三种情况:字符串里左方向的括号多余了。 2.括号没有多余,但是类型没有匹配上。 3.字符串里右方向的括号多余了。我们的代码只要覆盖了这三种不匹配的情况,就不会出现问题。三、完整代码cla原创 2022-02-03 17:58:28 · 540 阅读 · 0 评论 -
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈文章目录【LeetCode 24】225.用队列实现栈一、题意二、思考过程2.1用两个队列实现栈2.2使用一个队列实现栈一、题意二、思考过程用栈实现队列和用队列实现栈的方法是不一样的。2.1用两个队列实现栈class MyStack {public:/* 队列1和队列2*/ queue<int> que1; queue<int> que2;//辅助队列用来辅助 MyStack()原创 2022-02-03 15:41:04 · 162 阅读 · 0 评论 -
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列文章目录【LeetCode 23】232.用栈实现队列一、题意二、思路三、完整代码一、题意二、思路这是一道模拟题,不涉及到具体算法,考察的是对栈和队列的掌握。使用栈来模拟队列的行为,只用一个栈是不行的,一定需要两个栈:输入栈 stack_in输出栈 stack_out stack<int> stIn;//输入栈 stack<int> stOut;//输出栈在 push函数的时候,只要数据放进去就好了。原创 2022-02-02 21:22:05 · 900 阅读 · 1 评论 -
【VsCode+LeetCode】优雅玩法
【VsCode+LeetCode】优雅玩法再刷LeetCode的时候,官方代码编辑器IDE类似于一个记事本,编辑器,用起来麻烦还不能调试。刷题的时候总感觉少了点什么,本文介绍【VsCode+LeetCode】优雅玩法。VScode是一款代码编辑工具,在我看来它的优势有:高颜值轻量级便于开发调试、迭代跨平台支持多种编程语言海量插件开箱即用嵌入式/硬件开发/编译+烧录+调试一体它支持Windows,Linux和macOS等操作系统以及开源代码。它支持测试,并具有内置的Git版本控原创 2022-02-02 19:06:14 · 1665 阅读 · 0 评论 -
第五章 栈与队列
第五章 栈与队列理论基础文章目录第五章 栈与队列理论基础一、概念二、关于STL库版本三、栈和队列在C++中的底层实现一、概念栈和队列的特性分别是:栈: 后进先出队列: 先进先出二、关于STL库版本STL是 C++的标准库,内置了栈和队列两种数据结构,不同的语言实现栈和队列不一样,我们在这里只讨论 C++;只有了解了 STL的版本我们才能研究讨论栈和队列的底层实现。STL有三个版本如下:版本细节公司/个人HP STL其他版本的C++ STL,一般是以HP原创 2022-02-01 20:32:15 · 488 阅读 · 0 评论 -
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串文章目录【LeetCode 22】459.重复的子字符串一、题意二、思考过程三、完整代码一、题意二、思考过程在一个串中查找是否出现过另外一个串,这是KMP的看家本领。所以这道题依然要使用到KMP。不推荐hash和暴力破解。【重点】如下:如果next[len-1]!=0,说明字符串有最长相同前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。如果len%(len-(next[len-1]))==0,说明字符串有重复的子字符串。原创 2022-02-01 13:45:38 · 544 阅读 · 0 评论 -
【LeetCode 21】28. 实现 strStr()
【LeetCode 21】28. 实现 strStr()文章目录【LeetCode 21】28. 实现 strStr()一、题意二、思考过程2.1构造next数组三、完整代码一、题意二、思考过程2.1构造next数组构造next数组就是计算模式串s的前缀表的过程,分三步:初始化next数组:int j=0;//前缀末尾next[0]=0;//后缀末尾for(int i=1;i<s.size();i++){ xxx;//各种操作}处理前后缀不相同的情况:a原创 2022-01-31 11:18:42 · 510 阅读 · 1 评论