自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 最长递增子序列

一.最长连续递增子序列Q:输入一个数组,求数组中连续递增子序列的最大长度输入:5 ,{1,3,4,2,7}输出:3 (最长递增子序列为{1,3,4})解题思路:题目要求子序列连续,可以从起始位置开始一直向后判断,如果后一个位置大于该位置,则继续向后判断并记录长度;如果出现后一个位置小于前一个位置,那么就不必再向后判断,此时的长度就是以该起始位置开始的连续递增子序列的长度;将长度与...

2019-08-11 17:27:38 166

原创 单链表排序

Q:给出单链表L:L 0→L 1→…→L n-1→L n, 将其重新排序为:L 0→L n→L 1→L n-1→L 2→L n-2→…例如:1->4->2->3->5->9排序后:1->9->4->5->2->3解题思路:从题意我们可以发现,排序是按照一首一尾、一首一尾来进行我们可以先找到中间节点,将链表分割为两个部分;再将后...

2019-08-06 11:05:54 178

原创 链表排序(归并+递归)

Q:使用常量空间复杂度在O(n log n)时间内对链表进行排序。解题思路:题目要求时间复杂度最大为O(n*logn),因此我们考虑使用归并排序思想进行排序找到链表中间位置,将链表切成左右两部分;再找到左右两部分的中间位置将链表切断;直到左右部分的链表不能再切分为止;从下至上递归对切好的链表进行排序,即先让子链表有序,再依次向上让子链表间有序,最后使整个链表有序(二路归并)代码实现:...

2019-08-06 10:36:11 318

原创 归并排序

一.基本思想归并排序是建立在归并操作上的一个有效排序算法,该算法是分治法的典型应用。将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序;如果将两个子序列合并成一个序列,称为二路归并。二.图解算法步骤排序步骤:递归找到序列的中间位置,将序列分为两部分,直到不能再继续分为止递归排序分成的两部分;具体可以开一个辅助空间,空间大小为要排序的节点个数,对辅助空间进...

2019-08-05 20:11:43 127

原创 最长公共子串(动态规划)

Q:给定两个字符串,输出两个字符串的最长公共子串及长度,如果没有公共子串则输出0输入:asd12asfabd1asfba输出:3asf解题思路:首先理解清楚最长公共子串和最长公共子序列的区别;最长公共子串要求子串是要连续的,而公共子序列不要求连续建立二维数组,保存到该位置已经有几个字符串连续相等,初始化为0如果s1[i]==s2[j],那么v[i][j]=v[i-1][j-1...

2019-08-05 11:33:55 204

原创 走迷宫(广度优先搜索)

Q:给出一个迷宫地图,计算最快走出迷宫需要多少步?输入:每组数据是10*10,由‘#’和‘.’组成的迷宫,其中‘#’代表墙,‘.'代表通路;入口在第一行第二列,出口在最后一行第九列;从任意一个‘.’都能一步走到上下左右的‘.’;输出:每组数据,输出从入口到出口最短需要多少步解题思路:因为要求出最短路径,因此我们很容易想到利用广度优先搜索来计算路径广度优先搜索(BFS):利用队...

2019-07-29 15:19:40 401

原创 最长回文子串(动态规划)

Q:给定一个字符串s,找到s中最长的回文字串解决思路:动态规划,建立一个数组dp,用dp[l][r]表示s[l,r]是不是一个回文串,如果是则为true,不是就是falses[l,r]代表字符串从下标为l到下标为r的子串,如果s[l,r]是一个回文串,那么s[l+1][r-1]也是一个回文串;也就是说如果dp[l][r]=true,那么dp[l+1][r-1]也为true如果字符串只有1...

2019-07-26 19:31:33 578

原创 二叉树的下一个节点

Q:给定一个二叉树和其中一个节点,请找出中序遍历顺序的下一个节点并且返回;注意:树中的节点不仅包含左右子节点,同时包含指向父节点的指针。解题思路:要找出中序遍历顺序的下一个节点,则要首先搞清楚中序遍历的顺序,即先遍历左子树再遍历根节点再遍历右子树要找出下一个节点,分为下面几种情况:情况一:给定节点有右孩子,那么下一个节点则为它的右子树的最左节点(不论该节点是否是根节点,都是一样的)情况...

2019-07-21 19:25:49 140

原创 圆圈中最后剩下的数

Q:0~n-1这n个数字围成一个圆圈,每次删除圈内的第m个数字,求圆圈内最后一个剩下的数字解法一:list容器+迭代器解题思路:因为要每次删除一个数字,并且要遍历,因此需要找到一个方便遍历并且删除效率高的容器;这里我们使用list容器,因为它的删除效率高并且支持迭代器,我们用list模拟环首先将n个数字尾插进list中再使用迭代器开始遍历,每次从当前位置走m-1步就到达第m个数字,如果...

2019-07-21 16:02:12 181

原创 和为S的两个数字

Q:输入一个递增序列的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和为S,输出两个数的乘积最小的解题思路:查找两个数和为S,没有要求数字连续,因此我们可以采用“首尾指针法”第一个指针指向数组第一个元素,另一个指针指向数组最后一个元素,当它们的和大于S时证明和大了,因此要将尾指针左移减小和的大小;当和小于S时证明和小了,因此要将首指针右移增大和;最后要考虑的...

2019-07-20 16:03:32 115

原创 数组中只出现一次的数字

Q:一个整型数组里只有两个数字只出现一次,其他数字都出现了两次,请找出这两个只出现一次的数字解题思路:通过异或相关知识我们可以知道,成对出现的数字异或后结果为0,那么将这组数据一次异或后的结果就是只出现一次的两个数字异或的结果观察异或结果,比特位为1的就是只出现一次的两个数字比特位不同的位,通过移位并与1结果可以找到第一个比特位不同的位根据该比特位是否为1,可以将这组数据分为两组,成对出...

2019-07-19 19:57:37 100

原创 右值引用(移动构造+移动赋值)

一、概念在学习本节的时候,常常会因字面意思而导致错误认知,因此我们首先来理清一些概念左值:一般来讲在等号左边的都是左值,是可以被修改的值右值:在等号右边的值不一定是右值!!!右值是不可以被改变的值,例如常量、临时对象、表达式返回值等左值引用:例如int& lr=a;优点:在传值和传参的位置时使用,可以减少拷贝次数,提高运行效率右值引用:例如int&& rr=a;...

2019-07-09 22:55:09 945

原创 析构函数定义为虚函数

Q:析构函数为什么要定义为虚函数?1.我们在之前的学习中都知道,在调用构造函数时先调用基类的构造函数,再调用派生类构造函数;而当调用析构函数时,则要先调用派生类的析构函数再调用基类的析构函数#include<iostream>using namespace std;class A{public: A(){ cout << "A()" << end...

2019-07-06 12:12:46 1308

原创 整数中1出现的次数

Q:求任意非负整数区间中1出现的次数(从1到n中1出现的次数)例如:1-20之间1出现的次数为:1,10,11,12,13,14,15,16,17,18,19共12次思路:假如给定一个数字为abcde,c为百位的数字,那么要计算百位出现1的次数,我们会发现有三种不同的情况:如果百位数字为0,则百位出现1的次数由它的高位数字决定。例如12012,百位可能出现1的情况有100–199,11...

2019-06-27 18:35:26 388

原创 连续子数组的最大和

Q:给一个数组,返回它的最大连续子数组和例如:输入:{6,-2,-3,8,-15}返回:9方法一:思路:使用动态规划用sum记录当前子数组的和,res记录最大子数组的和如果sum+当前元素的值小于当前元素本身值,证明之前的子数组和对该元素没有贡献,所以从该元素开始重新记录,如果大于当前元素值则证明有贡献,继续向后记录res是当前子数组和与之前记录的最大值中较大的画图:代...

2019-06-23 18:07:51 111

原创 字符串的排列(递归)

Q:输入一个字符串,按字典序打印出该字符串中字符的所有排列,例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba思路:把一个字符串可以分为两个部分,第一部分为字符串的首字符,第二部分为剩下的字符串要求字符的全排列,就是把一个位置的字符依次与后面每个位置的字符进行交换得到新的字符串首先固定第一个字符,求后面所有字符的全排列;而...

2019-06-23 17:42:38 343

原创 复杂链表的复制(三步法)

Q:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head(注意:输出结果中不要返回参数中的节点引用,否则判题程序会直接返回空)思路:首先,复制节点并插入在该节点后面还原原节点的特殊指针指向拆分原链表和新链表...

2019-06-21 16:35:59 121

原创 二叉搜索树与双向链表(递归)

Q:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:二叉搜索树本身就是一棵有序的树,要转换成一个排序的链表,则就是它的中序遍历,遍历的第一个结点是最左结点定义一个prev指针保存它的前一个结点,调整指针指向画图:| 代码:定义树的结点:struct TreeNode { int val; struct...

2019-06-20 20:58:13 172

原创 合并两个有序链表

Q:输入两个单调递增的链表,输出两个链表合成后的链表,使合成后的链表也满足单调递增输入:A:2->4->6->7->10B:1->2->3->8->9输出:1->2->2->3->4->6->7->8->9->10代码:定义链表节点:struct ListNode { int v...

2019-06-19 16:41:01 106

原创 判断一个树是否是另一个树的子结构

Q:给定一个树A和树B,判断树B是否是树A的子结构(约定空树不是任何一个树的子结构)解题思路:用递归的思想如果根节点相同,则继续判断左右节点是否相同如过根节点不同,则递归判断左右节点及其子树代码:定义树的节点:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode...

2019-06-19 16:15:31 355

原创 合法括号序列判断(利用栈)

题目描述:给定一个括号字符串序列和一个整型数字,如果括号匹配合法则输出“Y”,否则输出“N”例如:输入:“(()()” 5输出:N输入:“(()())” 6输出:Y输入:"((a))" 5输出:Y解决思想:运用栈结构,当字符为左括号或者字符时入栈当字符为右括号且栈顶元素为左括号时出栈当栈顶元素为字符时,则一直循环出栈直到栈顶元素为括号如果最终栈为空则匹配合法,否则...

2019-05-28 19:45:02 664

原创 I/O多路转接(select)

一.基本概念select系统调用是用来让我们的程序监视多个文件描述符状态变化的程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了改变二.函数原型#include<sys/select.h>int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptions,struct tim...

2019-05-22 09:21:41 161

原创 AVL树的旋转

一.AVL树的旋转由于在插入新节点后可能会导致双亲的平衡因子变为2或-2,此时为了保证该树依然是AVL树,则要进行旋转;我们将AVL树的旋转分为左单旋,右单旋,左右双旋,右左双旋四种情况情况一:左单旋如果新节点插入在较高右子树的右侧,此时进行左单旋在节点16的右侧插入节点后,根节点的平衡因子变为2,此时进行左单旋(降低右子树高度)思想: parent变为subR的左子树,subRL变为...

2019-05-09 20:05:53 167

原创 AVL树

一.AVL树的概念一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树左右子树都是AVL树左右子树高度之差(平衡因子)的绝对值不超过1例如:上面这棵树不是一个AVL树,因为节点16的平衡因子为2,超过了1,此时为了让它变成AVL树,则要进行旋转2.AVL树节点的定义template<class K,class V>struct AVLTreeNode{ ...

2019-05-09 16:54:29 130

原创 栈和队列的互相实现

一.用队列实现栈class MyStack {public: void push(int x) { q1.push(x); } //删除栈顶元素并返回元素值 int pop() { int size=q1.size()-1; while(size--) { q2.p...

2019-05-06 20:46:37 157

原创 memcpy拷贝重叠及memmove

一.memcpy功能:从源内存地址起始位置拷贝若干个字节到目标地址中void* my_memcpy(void* dst, const void* src, size_t count){ void* ret = dst; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char...

2019-05-06 17:24:15 750

原创 左右最值最大差(贪心算法)

Q:给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0…K],右部分A[K+1…N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?(给出数组和数组长度)例如:[3,9,1,5,2,0] 6返回:9分析:结果最大差值为9分为三种情况:假如最大值在A[0]位置,那么右半部分则要找...

2019-04-29 15:45:47 520

原创 二叉搜索树概念及实现

一.概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树二.二叉搜索树的操作1.查找若根节点不为空:如果根节点key ==查找key,返回true如果根节点key<查找key,在它的右子树查找如果根...

2019-04-27 18:08:52 132

原创 最长公共子序列问题(动态规划)

Q:给定两个字符串s1和s2,求两个字符串的最长公共子序列(例如:s1为abcfbc,s2为abfcab,则最长公共子序列为abcb或abfc,最长公共子序列可以不连续)首先将s1作为行,s2作为列,构建一个二维数组dp,dp[i][j]代表s1字符串中从0到i与s2字符串中从0到j的公共子序列如果s1[0]==s2[0],则dp[0][0]=1,否则dp[0][0]=0由上图我们可以...

2019-04-23 14:44:31 373

原创 多态的原理

一.虚函数表class A{public: virtual void Func1() { cout << "A::Func1()" << endl; } virtual void Func2() { cout << "A::Func2()" << endl; } void Func3() { cout <&lt...

2019-04-23 12:19:49 207

原创 二叉树的层序遍历

一.层序遍历概念:按行进行二叉树遍历使用队列结构,当队头节点出队时,如果它的左右节点不为空,则左右节点进队列计算队列的大小size, 将每一行节点val值放进一个vector< int >结构中,size–,对头节点出队列,将它左右节点push进队列中,循环直到size为0将每行vector< int >尾插进一个vector<vector< int...

2019-04-20 15:51:15 124

原创 二叉树的后序遍历

一.递归二叉树的后序遍历过程为先遍历左子树,再遍历右子树,最后访问根节点先访问根节点的左子树,3的左子树为空,则访问3的右子树5,5的左右子树都为空,访问根节点5,然后返回访问节点3根节点7的左子树访问完之后,访问7的右子树,访问节点2的左子树,节点1的左右子树都为空,访问节点1,2的右子树为空,返回访问节点2根节点7的右子树遍历完,最后访问根节点7因此后序遍历为:5->3-&...

2019-04-20 14:12:47 378

原创 二叉树的中序遍历

一.递归二叉树的中序遍历过程为先遍历左子树,再访问根节点,最后遍历右子树首先访问根节点7的左子树,访问节点3,3没有左子树,则访问右子树5根节点的左子树遍历完,访问根节点最后访问根节点的右子树2,访问2的左子树1,1没有左右子树,返回2,访问2的右子树,为空返回节点因此中序遍历为:3->5->7->1->2C语言: struct TreeNode { ...

2019-04-20 11:25:08 303

原创 二叉树的前序遍历

一、递归实现前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树上图中蓝色数字简单标出遍历过程,因此前序遍历为:7->3->8->2->4->1->6题目描述:给定一棵二叉树,返回它的前序遍历C语言:struct TreeNode{ int val; struct TreeNode* left; struct TreeNode*...

2019-04-19 23:42:47 255

原创 模板的分离编译与总结

1.概念一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式2.模板的分离编译假如我们将模板的声明定义分离开,在头文件中声明,源文件中定义:// a.htemplate<class T>T Add(const T& left,const T& right)//a....

2019-04-19 10:50:54 167

原创 类型萃取

一、类型萃取(类模板特化应用)Q:如何实现一个通用的拷贝函数?1.使用memcpy函数template<class T>void Copy(T* dst,const T* src,size_t size){ memcpy(dst,src,sizeof(T)*size);}上面实现虽然任意类型的空间都可以拷贝,但是自定义类型有可能涉及到深拷贝,而memcpy是浅拷贝...

2019-04-19 09:24:58 153

原创 C++类型转换

一、C语言中的类型转换int main(){ int i=1; double d=i; //隐式类型转换 printf("%d,%.2f\n",i,d); int * p=&i; int ar=(int)p; //显示的强制类型转换 printf("%x,%d\n",p,address);}缺陷:转换的可视性较...

2019-04-18 11:32:51 154

原创 map 和 set

一、set1.set的简单介绍set是按照一定次序存储元素的容器set中的元素是不能被修改的,只能支持增、删、查(否则元素可能变为无序的)set中元素的value标识它,并且每个value必须是唯一的2.功能set的底层实际是一个搜索树可以查找关键字在不在(find()接口)排序+去重int main(){ set<int> s; s.insert(3...

2019-04-18 09:14:37 166

原创 模板进阶

一、非类型模板参数模板参数分为类类型形参与非类型形参类类型形参:跟在class或者typename之后的参数类型名称非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用浮点数、类对象以及字符串不允许作为非类型模板参数非类型的模板参数必须在编译期就能确认结果二、模板的特化1.概念:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板...

2019-04-17 09:30:13 93

原创 模板初阶

一、泛型编程思考:如何实现一个通用的交换函数?通常我们想到的方法是函数重载,但函数重载虽然可以实现,但有几个缺陷:1.重载的函数仅仅是类型不同,代码的复用率较低,如果出现新的类型,就要再次进行重载2.代码的可维护性比较低,一个出错则可能其他所有的重载全部出错泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板可分为类模板和函数模板二、函数模板1.概念...

2019-04-15 11:32:51 130

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除