![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
蒲公英干草怪
这个作者很懒,什么都没留下…
展开
-
C++编程:仅用递归函数和栈操作逆序一个栈
int getBottom(stack<int>& st){ //获取栈底元素 int result = st.top(); st.pop(); if(st.empty()){ //到栈底了 return result; } else{ int last = getBottom(st); st.push(result); return last; }}void resve原创 2022-03-03 21:11:48 · 469 阅读 · 0 评论 -
C++编程:双栈排序
C++编程:双栈排序使用一个栈实现另一个栈的排序,最多可以使用一个int型变量。void func(stack<int>& st1,stack<int>& st2){ int tmp; while (!st1.empty()) { tmp = st1.top(); st1.pop(); while (!st2.empty() && tmp<st2.top()) {原创 2022-03-03 20:21:54 · 390 阅读 · 0 评论 -
C++编程:关于二叉排序树的一道有疑问的题目待优化
//题目要求:一颗二叉排序树,给定一个数字target,尽量优化的方式去寻找target和节点的差的绝对值最小的节点//算法思想:其实就是找一条路径,target肯定在这条路径上才可以找到最小的值//下面的解法不一定正确,后续可能会有优化。//使用st保存这条路径上的节点,执行完func之后,对栈里的元素进行遍历,找到最小的绝对差值//虽然每一步都push节点了,但是其实小于节点的时候,只递归了左子树,并未考虑右子树void func(TreeNode* root,int target,stack原创 2022-02-23 22:29:38 · 359 阅读 · 0 评论 -
C++编程:常用排序算法
C++编程:常用排序算法冒泡排序算法思想:比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;针对所有的元素重复以上的步骤,除了最后一个;重复步骤1~3,直到排序完成。void mySort(vector<int>& nums){ if(nums.size()<2){ return; } for(int i = 0; i<n原创 2022-02-23 00:54:53 · 763 阅读 · 0 评论 -
C++编程:单例模式的几种写法
C++编程:单例模式的几种写法懒汉式#include <iostream>using namespace std;//懒汉式class Single{public: //静态的获取实例的方法 static Single* getInstace(){ if(NULL == instance){ instance = new Single(); } return instance; }原创 2022-02-21 20:02:39 · 1618 阅读 · 0 评论 -
C++编程:自定义String类的构造函数、析构函数、拷贝构造函数和赋值函数
C++编程:自定义String类的构造函数、析构函数、拷贝构造函数和赋值函数头文件如下://类Stringclass String{public: String(const char *str = NULL);//普通构造函数 ~String(void); String(const String &other); String & operator = (const String &other); private:原创 2022-02-19 00:30:26 · 892 阅读 · 0 评论 -
算法-二叉树:二叉树的最近公共祖先
算法-二叉树:二叉树的最近公共祖先元素不重复。普通二叉树的最近公共祖先思路解析:从叶子节点自下而上去查找祖先,自然选择后序遍历。如果一个节点,左子树出现p右子树出现q(或左q右p),那么就说明这个节点是最近的公共祖先。同样可以采用递归写法。注意:当递归有返回值的时候,搜索一条边或一个元素可以return,搜索整棵树时不可以return。因为后者要用到返回值做逻辑判断。TreeNode* lowest(TreeNode* root, TreeNode*p,TreeNode*q){ if(ro原创 2022-02-10 02:20:39 · 582 阅读 · 0 评论 -
算法-二叉树:二叉搜索树中的众数
算法-二叉树:二叉搜索树中的众数将二叉搜索树中出现次数最多的元素的集合输出,当有多个要输出的元素时不用考虑输出顺序。思路解析:如果是普通二叉树的话,可以这么做:遍历一遍树,存入map,key为元素,value为出现次数;将map转存为vector,根据value从大到小排序;遍历vector,如果和vector[0].second相等的话,就存入集合,否则直接break结束程序。对于二叉搜索树来说,可以这么做:采用一次中序遍历(利用pre和cur)得到每个元素的出现次数(用数组原创 2022-02-10 01:37:03 · 563 阅读 · 0 评论 -
算法-二叉树:二叉搜索树的最小绝对差
算法-二叉树:二叉搜素树的最小绝对差给出一颗所有节点为非负值的二叉搜索树,请计算树中任意两个节点的差的绝对值的最小值。方法一:中序遍历后转为有序数组,然后遍历一遍数组去求最小绝对差。在此不做过多说明。方法二:中序遍历递归,依旧定义一个pre指向前一个节点。TreeNode* pre = NULL;int result = INT_MAX;void traversal(TreeNode* root){ if(root == NULL) return ; traversal(root原创 2022-02-10 00:37:05 · 283 阅读 · 0 评论 -
算法-二叉树:验证二叉搜索树
算法-二叉树:验证二叉搜索树题目描述:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值。若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值。它的左右子树也分别是二叉搜索树。方法一:使用中序遍历将二叉搜索树存入数组,判断数组是不是有序的即可。void traversal(TreeNode* root,vector<int>& nums){ if(root == NULL ) return ; traversal(root->lef原创 2022-02-10 00:20:26 · 864 阅读 · 0 评论 -
算法-二叉树:在二叉搜索树中寻找节点
算法-二叉树:在二叉搜索树中寻找节点确定一个节点是否在二叉搜索树中,如果在,则返回这个节点,如果不在,则返回NULL。树中没有重复元素。方法一:递归TreeNode* searchNode(TreeNode* root,int target){ if(root == NULL || root->val == target) return root; if(target < root->val){ return searchNode(root->l原创 2022-02-09 23:16:20 · 928 阅读 · 0 评论 -
算法-二叉树:合并两颗二叉树
算法-二叉树:合并两颗二叉树思路解析:使用t1和t2节点同时遍历两棵树,将两颗树的每个根节点相加;如果t1为空,那么合并之后就是t2;如果t2为空,那么合并之后就是t1。方法一:采用递归,下面程序使用前序遍历(前中后都可)。TreeNode* plusTree(TreeNode* t1,TreeNode* t2){ if(t1 == NULL) return t2; if(t2 == NULL) return t1; //重新定义了一棵树,也可以不定义而是直接加到t1原创 2022-02-09 23:02:36 · 1393 阅读 · 0 评论 -
算法-二叉树:构造一颗二叉树(前序+中序)
算法-二叉树:构造一颗二叉树(前序+中序)思路解析:以前序的第一个元素作为切割点,去切割中序数组;根据中序数组切割的长度去切割前序数组;递归,直至前序数组的长度变为1,就找到了叶子节点。//nums1为中序数组,nums2为前序数组TreeNode* toTree(vector<int> nums1,vector<int>nums2){ if(nums2.size() == 0) return NULL; TreeNode* root = new Tr原创 2022-02-09 22:30:13 · 253 阅读 · 0 评论 -
算法-二叉树:构造一颗二叉树(中序+后序)
算法-二叉树:构造一颗二叉树使用中序与后序遍历序列(没有重复元素)构造一颗二叉树。思路解析:后序最后一个元素去切割中序数组;中序数组分为中序左数组和中序右数组,对应的将后序数组切割为后序左数组和后序右数组;对后序左数组、右数组依次做上述步骤,直至后序数组被切割为一个元素。//nums1为中序数组,nums2为后序数组TreeNode* toTree(vector<int> nums1,vector<int>nums2){ if(nums2.size()==0原创 2022-02-09 22:03:59 · 363 阅读 · 0 评论 -
算法-二叉树:路径总和-找出所有路径
算法-二叉树:路径总和-找出所有路径void pathSum(TreeNode* root,vector<int>& path,vector<string>& str,int target){ if(root == NULL) return; path.push_back(root->val);//中 if(!root->left && !root->right && target==root原创 2022-02-07 20:29:21 · 162 阅读 · 0 评论 -
算法-二叉树:路径总和(是否存在路径)
算法-二叉树:路径总和(是否存在路径)判断是否存在一条从根节点到叶子节点的路径,使这个路径的节点总和等于目标值。//方法一:递归bool pathSum(TreeNode* root,int target){ if(root == NULL) return false; if(!root->left && !root->right && target==root->val) { //遇到叶子节点 return true;原创 2022-02-07 20:08:16 · 325 阅读 · 0 评论 -
算法-二叉树:二叉树的所有路径
算法-二叉树:二叉树的所有路径给出一个二叉树,返回所有从根节点到叶子节点的路径。思路解析:需要从父节点指向子节点,显然使用前序遍历比较方便。//方法一:递归void allPath(TreeNode* root,vector<int>& path, vector<string>& str){ //中 path.push_back(root->val); if(root->left==NULL && root-原创 2022-02-07 18:39:04 · 362 阅读 · 0 评论 -
算法-二叉树:平衡二叉树
算法-二叉树:平衡二叉树判断一棵树是不是平衡二叉树。平衡二叉树:每一个节点的左子树和右子树的高度差的绝对值不超过1。思路解析:求二叉树的高度,只能从下到上去查找,所以需要后序遍历。和求深度不同。//方法一:递归int height(TreeNode* root){ if(root == NULL) return 0; int leftHeight = height(root->left); if(-1 == leftHeight) return -1; int原创 2022-02-07 17:53:16 · 620 阅读 · 0 评论 -
算法-二叉树:二叉树的最小深度
算法-二叉树:二叉树的最小深度求一颗二叉树的最小深度,根节点的深度为1。最小深度:从根节点到最近叶子节点的最短路径上的节点数量。//方法一:递归int height(TreeNode* root){ if(root == NULL) return 0; //如果左子树为空,那么最小深度按照右子树计算 if(!root->left && root->right){ return 1+height(root->right)原创 2022-02-07 17:10:12 · 1441 阅读 · 0 评论 -
算法-二叉树:二叉树的最大深度
算法-二叉树:二叉树的最大深度求一颗二叉树的最大深度,根节点的深度为1。思路解析:构造二叉树时,一般选择前序遍历;求普通二叉树的属性,一般选择后序遍历;求二叉搜索树的属性,一般选择中序遍历。注意:对于普通二叉树单纯求深度使用前序遍历就行。//方法一:递归int height(TreeNode* root){ if(root == NULL) return 0; int left = height(root->left); int right = height原创 2022-02-07 16:27:25 · 379 阅读 · 0 评论 -
算法-二叉树:对称二叉树
算法-二叉树:对称二叉树给出一个二叉树,判断其是不是中心轴对称的。//方法一:递归实现bool compare(TreeNode* left,TreeNode* right){ //左右均为空,返回true if(left==NULL && right==NULL){ return true; } //左空右不空 else if(left==NULL && right!=NULL){ return原创 2022-02-07 16:12:24 · 271 阅读 · 0 评论 -
算法-二叉树:反转二叉树
算法-二叉树:反转二叉树思路解析:只要把每个节点的左右孩子反转一下就可以了,注意不要采用中序遍历,因为可能会把某些节点的左右孩子反转两次。以下方法采用前序遍历,方法一采用递归,方法二采用迭代。//方法一:前序遍历递归实现TreeNode* traversal(TreeNode* root){ if(root == NULL) return root; swap(root->left,root->right); traversal(root->left);原创 2022-02-07 00:34:02 · 414 阅读 · 0 评论 -
算法-二叉树:二叉树的层序遍历
算法-二叉树:二叉树的层序遍历#include <iostream>#include <vector>#include <queue>#include <stack>#include <algorithm>using namespace std;struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int val) :原创 2022-02-07 00:01:00 · 239 阅读 · 0 评论 -
算法-二叉树:前、中、后序的统一迭代法
算法-二叉树:前、中、后序的统一迭代法思路解析:将要访问的节点放入栈,将要处理的节点放入栈之后紧接着放入一个空指针作为标记。#include <iostream>#include <vector>#include <queue>#include <stack>#include <algorithm>using namespace std;struct TreeNode{ int val; TreeNode *lef原创 2022-02-06 22:45:39 · 77 阅读 · 0 评论 -
算法-二叉树:前、中、后序的迭代遍历
算法-二叉树:前、中、后序的迭代遍历使用栈可以实现迭代遍历。#include <iostream>#include <vector>#include <queue>#include <stack>#include <algorithm>using namespace std;struct TreeNode{ int val; TreeNode *left; TreeNode *right; Tree原创 2022-02-06 22:15:24 · 338 阅读 · 0 评论 -
算法-二叉树:前、中、后序的递归遍历
算法-二叉树:前、中、后序的递归遍历#include <iostream>#include <vector>#include <queue>#include <algorithm>using namespace std;struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int val) : val(val),left(nullpt原创 2022-02-06 12:59:55 · 349 阅读 · 0 评论 -
算法-栈和队列:接雨水
算法-栈和队列:接雨水给出一排宽度为1、高度为n的柱子,求可以接到雨水的面积。思路解析:方法一:采用双指针解法,按列计算,第一个柱子和最后一个柱子不接雨水,因为宽度为1所以每一列的面积=min[左边最高高度,右边最高高度]-Height,如果小于0则取0。方法二:采用动态规划解法,和方法一类似,也是按列计算,但是为了避免重复计算,使用数组maxLeft保存每个位置的左边最高高度(当前位置的左边最高高度是前一个位置的左边最高高度和本高度比较后的最大值),使用数组maxRight保存每个位置的右边最高原创 2022-02-02 20:19:49 · 612 阅读 · 0 评论 -
算法-栈和队列:前k个高频元素
算法-栈和队列:前k个高频元素在一个数组里找出出现频率前k高的元素。思路解析:找出每个元素出现的频率(可以用map);按照频率高低来排序(优先级队列);找出前k个元素。#include <iostream>#include <queue>#include <vector>#include <algorithm>#include <unordered_map>using namespace std;class MyCom原创 2022-02-02 18:21:43 · 896 阅读 · 0 评论 -
算法-栈和队列:滑动窗口最大值
算法-栈和队列:滑动窗口最大值一个大小为k的滑动窗口,从前向后在数组nums上移动,返回滑动窗口每移动一次时窗口中的最大值。要求时间复杂的:O(n)。思路解析:采用单调队列用于记录k个值中有可能的最大值,队头到队尾采用由大到小(存重复值),队头元素永远是当前窗口的最大值。构建单调队列的规则如下:pop:窗口移除的元素等于队头,那么弹出队头,小于队头的情况不用处理;push:如果新增的元素大于队尾,那么将队尾的值依次弹出,直至新增元素小于等于队尾。构建单调队列时还是队头出队尾入,只不过队尾可以出原创 2022-02-02 01:35:51 · 65 阅读 · 0 评论 -
算法-栈和队列:逆波兰表达式
算法-栈和队列:逆波兰表达式给出逆波兰表达式,求得对应的值。#include <iostream>#include <stack>#include <vector>using namespace std;int evalRPN(vector<string> s){ //要用vector而不是string,因为不一定是个位数,一个数字可能是多位数 stack<int> st; for(int i = 0; i <原创 2022-02-01 23:22:27 · 165 阅读 · 0 评论 -
算法-栈和队列:匹配括号
算法-栈和队列:匹配括号一个字符串只要有左括号"("、"{"、"[",就会有")"、"}"、"]"。字符串只包含以上字符,判断字符串是否合法。思路解析:括号匹配是用栈解决的经典问题。依次遍历字符串,将左括号依次进栈,当出现右括号时,与栈头元素进行匹配,匹配会出现以下几种不匹配的情况:右括号和栈头左括号不匹配;右括号匹配时栈已经空了;遍历结束了,但栈没空。小技巧:在进行左括号进栈操作时,直接将相应的右括号推入栈,这样匹配的时候判断是否相等就行。#include <iostream>原创 2022-02-01 22:40:38 · 833 阅读 · 0 评论 -
算法-栈和队列:用队列组成栈
算法-栈和队列:用队列组成栈使用队列(单向队列)实现栈的下列操作:pop():弹出栈顶元素。push(x):将x入栈。top():获取栈顶元素。empty():返回栈是否为空。#include <iostream>#include <queue>using namespace std;class MyStack{public: queue<int> quIn; queue<int> quOut;//纯纯用来备份的原创 2022-02-01 21:27:51 · 611 阅读 · 1 评论 -
算法-栈和队列:用栈实现队列
算法-栈和队列:用栈实现队列使用两个栈实现队列的功能:pop():弹出队头元素。peek():获取队头元素。push(x):从队尾添加元素。empty():队列是否为空。#include <iostream>#include <stack>using namespace std;class MyQueue{public: stack<int> stIn; stack<int> stOut; //- pus原创 2022-02-01 20:15:20 · 394 阅读 · 0 评论 -
算法-字符串:找到重复的子字符串
算法-字符串:找到重复的子字符串给出一个非空字符串,判断是否有重复子字符串,有的话输出true,否则输出false。#include <iostream>#include <algorithm>using namespace std;//字符串长度为len,以下几点作为我们的判断依据(采用前缀表-1的方式)://next[len-1]!=-1,说明存在相同的前后缀//next[len-1]+1,就是最长相等前后缀长度,len-(next[len-1]+1)相当于第一个原创 2022-01-30 18:00:55 · 1517 阅读 · 0 评论 -
算法-字符串:使用KMP匹配字符串
算法-字符串:使用KMP匹配字符串在文本串s中查找是否出现过模式串t,如果出现过则返回匹配的第一个位置,如果没出现过则返回-1。#include <iostream>#include <algorithm>using namespace std;//使用KMP算法匹配字符串的解题思路:构建next数组,使用next数组做匹配//构建next数组(处理前后缀不相同的情况,处理前后缀相同的情况):采用next数组和j都-1来实现void getNext(int *nex原创 2022-01-30 16:13:41 · 613 阅读 · 0 评论 -
算法-字符串:反转字符串里的单词
算法-字符串:反转字符串里的单词给定一句英文,要求倒叙输出每一个单词,并删除单词两边冗余的空格(句子前面和后面没有空格,两个单词直接只有一个空格)。注意:不可以使用额外的辅助空间,原地修改字符串。#include <iostream>#include <algorithm>using namespace std;//首先去除原字符串多余的空格,然后反转整个字符串,然后根据空格判定并反转单词void removeSpaces(string &s){ /原创 2022-01-30 12:54:51 · 230 阅读 · 0 评论 -
算法-字符串:反转字符串II
算法-字符串:反转字符串II分段反转字符串,在字符串中,从前向后遍历,每隔2k个字符的前k个字符需要反转,如果剩下的字符小于k个,则反转剩下的所有字符,如果剩下的字符小于2k且大于等于k个,则反转前k个字符。#include <iostream>using namespace std;//直接使用reverse库函数就可以实现字符串反转string reverseStr(string s,int k){ for(int i = 0; i < s.size(); i+=原创 2022-01-30 01:33:21 · 313 阅读 · 0 评论 -
算法-字符串:反转字符串
算法-字符串:反转字符串将一个字符串反转。#include <iostream>using namespace std;//直接使用reverse库函数就可以实现字符串反转string reverseStr(string s){ for(int i = 0; i < s.size()/2; i++){ swap(s[i],s[s.size()-1-i]);//swap库函数有两种实现方式:临时变量or亦或 } return s;}int原创 2022-01-30 01:05:22 · 297 阅读 · 0 评论 -
算法-哈希表:四数之和
算法-哈希表:四数之和在一个数组中,找到四个元素(这四个元素就是一个四元组),使其相加等于target。问在这个数组中可以找到多少组这样的元祖(四元组不可重复)?输出这些四元组。#include <iostream>#include <vector>#include <algorithm>using namespace std;//采用双指针解法,在三数之和的基础上再嵌套一层for循环//对数组进行排序,通过两次for循环,left为j后的第一个值,rig原创 2022-01-29 15:58:14 · 506 阅读 · 0 评论 -
算法-哈希表:三数之和
算法-哈希表:三数之和在一个数组中,找到三个元素(这三个元素就是一个三元组),使其相加等于0,这个数组中可以找到多少组这样的元组?输出这些三元组。#include <iostream>#include <vector>#include <algorithm>using namespace std;//本题使用哈希解法不太合适,通过两次for确定a和b的值,然后采用哈希法确定数组中是否出现(0-(a+b)),可行但去重非常麻烦。//采用双指针解法,对数组进行原创 2022-01-29 01:13:17 · 575 阅读 · 1 评论