【算法】分治算法
分治算法
将一个规模为N的问题分解为k个较小的子问题,这些子问题遵循的处理方式就是互相独立且与原问题相同。
两部分组成:
分(divide):递归解决较小的问题。
治(conquer):然后从子问题的解构建原问题的解。
三个步骤:
分解(divide):将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
解决(conquer):若干子问题规模较小而容易被解决则直接解决,否则递归解决各个子问题。
合并(Combine):将各个子问题的解合并为原问题的解。
递归实现二分查找
123456789101112131415161718192021222324252627282930313233343536#include<iostream>using namespace std;//递归实现二分查找//找到这个值最后一级一级的传递return回来int BinarySearch(int* arr,int minSub,int maxSub,int num){ if (minSub > maxSub)//无解 { ...
【图】最短路径算法
图的最短算法
从起点开始访问所有路径,可以到达终点的有多条地址,其中路径权值最小的为最短路径。最短路径算法有深度优先遍历、广度优先遍历、Bellman-Ford算法、弗洛伊德算法、SPFA(Shortest Path Faster Algorithm)算法和迪杰斯特拉算法等。
本代码使用深度优先遍历
主要实现思路:
从起点开始,到达终点有多条分支,这些分支中又有多条分支…选择其实一条分支,走到终点,再选择另一个分支(temp = temp ->next)走到终点,分支的分支……
大致流程:代码实现:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 ...
LeetCode刷题(19)【简单】二叉树的前&&中&&后序遍历(C++)
精华在于进栈和出栈的时机
94.二叉树的中序遍历题目
思路:中序遍历的顺序是,左 - 根 - 右创建一个栈来存储结点,创建一个vector来存储中序遍历的值从根结点开始,只要该结点有左子树,就将该结点压进栈中。直到root为空。取出栈顶元素,栈顶元素出栈,将该结点值存进recv。…剩下的只可意会不可言传了,
感谢这位老哥分享——链接
123456789101112131415161718192021222324252627class Solution {public: //中序遍历顺序-左-中-右 vector<int> inorderTraversal(TreeNode* root) { vector<int>recv; stack<TreeNode*> Tstack; //当前结点不为空或当前栈不为空 while(root || !Tstack.empty()) { while(root) ...
【数据结构】哈希表(C++)
哈希表概念哈希表-散列表, 它是基于快速存储的角度设计的,也是一种典型的“空间换时间”的做法。
(键值(编号)就代表了这个数据。)
链式存储实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177#inc ...
【数据结构】树——二叉搜索树(C++)
树概念
树状图是一种数据结构,它是由 n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除 了根结点外,每个子结点可以分为多个不相交的子树。
二叉树
同线性表,一个没有限制条件的线性表就是一个数组,但是加以限制条件就得到了非常有用的栈、队列、优先队列等。
引出二叉树
树也是一样,一个没有限制的树由于太灵活,控制起来比较复杂。如果对普通的树加上一些人为的限制,比如 结点只允许有两个子结点,这就是二叉树。
二叉树是一个每个结点最多只能有两个分支的树,左边的分支称之为左子树,右边的分支称之为右子树。
如下图所示:
(1).在非空二叉树中,第 i-1 层的结点总数不超过 , i>=1;
(2).深度为 h-1 的二叉树最多有 2的h次方个结点(h>=1),最少有 h 个结点;
(3).对于任意一棵二叉树,如果其叶结点数为 N0,而度数为 2 的结点总数为 N2,则 N ...
【树】红黑树构建过程(略)
红黑树定义
是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找(搜索)树,满足下列性质:
1)节点是红色或黑色;
2)根节点是黑色;
3)所有叶子节点都是黑色节点(NULL);
4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点
红黑树可以解决二叉树搜索树出现的长短腿情况
构建过程
红黑树是一种自平衡二叉查找树,从上面红黑树的图可以看到,根结点右子树显然比左子树高,但左子树和右子树的黑结 点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点。所以我们叫红黑树这种平衡为黑色完美平衡。
给定如下数组来构建红黑树
1.使用第一个元素创建一个根结点(黑色)。
2.插入13,根据二叉搜索树规则,应该插入到左侧,此时插入红色结点不会破坏红黑树平衡,直接插入即可。
3.插入16,插入红色结点不会破坏平衡,直接插入。
4.插入11,此时插入红色结点会破坏平衡(红色结点下面必须是两个黑色结点),但插入黑色结点也会破坏平衡(从任一结点 ...
C语言风格字符串注意点
C语言风格字符串注意点注意:
strlen()
sizeof()
/转义字符种类
这种写法编译器会自动在结尾填充\0
char a[] = “aaas3”;
这种写法需要手动填充\0,否则后面会输出多余的内容 char b[] = { ‘a’,’a’,’a’,’s’,’3’};
这种写法也要手动添加\0,否则后面会输出多余的内容
char c[6]; c[0] = ‘a’; c[1] = ‘a’; c[2] = ‘a’; c[3] = ‘s’; c[4] = ‘3’; c[5] = ‘\0’;
这种同第一种
const char* d = “aaas3”;
strlen遇到\0结束,不包括\0
char temp1[] = “abc\0abc”; strlen(temp1);//结果为3 sizeof(temp1);//结果为字符数组的大小,也就是8,默认会在结尾填充一个\0,所以指定字符数组存储元素的个数是你字符个数+1,否则就会报错,或者不指定,就像这样。
12345678例:char temp2[] = "AB\x78\\ab\023";strlen( ...
【数据结构】栈(C++)
栈只能在一边进出,先进的后出。
进出的一端叫做栈顶,另一端叫做栈底。
栈可以使用顺序存储结构,也能使用链式存储结构。
注意:栈只能在一端进行操作,这是栈的关键特征,也就是说栈不允许在中间进行查找、插入、删除等操作,(但是在实际应用中我们可以打破它)。
这里掌握初始化、入栈、出栈、取栈顶元素操作即可。
顺序存储结构实现栈1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798#include<iostream>using namespace std;#define MAX_SIZE 128typedef int DataType;//栈的结构有多重方式定义,不用局限于这一种/* 例如: 定义两个int型,并且直接开辟好数组空间 定义一个指针,一个int to ...
【栈】实现表达式求值
【栈】实现表达式求值思路 && 理解 && 注意
给定一串表达式,字符串类型,依次遍历从头开始遍历每一个位置的内容。
第一个数字,第一个运算符先直接往栈里面push(两个不同的栈)接着走,遇到数push进来,接着走,遇到运算符,和前面那个已经push进栈的运算符进行优先级比较,如果当前运算符优先级大,那就接着push进来,反之,pop出栈,运算前面的式子之和(之后判断运算符栈中是否还有内容,并且当前运算符的优先级是否小于等于已有的运算符,小于等于就接着运算前面的表达式,完成push当前运算符,反之继续往下遍历push…pop…),直到最后一个元素。
注意;
一直发生变化的是rdata-右操作数,所以每次压完运算符找新的右操作数都会将他置空,准备重新赋值。
没有添加括号优先级运算。
expression.h123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676 ...
【栈】实现迷宫求解
迷宫求解从入口进入开始, 向不同方向试探,走到死胡同就退回。
找迷宫通路需要使用回溯法,找迷宫通路是对回溯法的一个很好的应用,实现回溯的过程用到数据结构—栈!
回溯法:
对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的 算法;当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个结点,继续 搜索该节点外的其他尚未搜索的分支;如果发现该结点无法再搜索下去,就让搜索过程回溯到这个结点的前一 结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或者搜索完了全部可搜索分支没有解存 在为止
思路&解释
二维数组作为地图。
一开始确定一个入口——需要判定入口是否合法。
先将入口位置坐标压入栈,只要栈中不为空,那么每次判断移动方向前都要判断当前位置是不是出口。然后由此坐标开始向四周判断,判断哪有路可以走,是路就开始移动(cur-当前位置),压进栈……,走到死胡同,说明四周都不能走了,开始边popStack边向四周判断,不放过来时路上的任何一个遗漏的可能出口路径,反之,找到出口直接retur ...
LeetCode刷题(18)【中等】删除链表的倒数第 N 个结点(C++)
19. 删除链表的倒数第 N 个结点
题目——[链接](19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com))
遍历统计方法1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head)//空的直接返回 { return NULL; } int count = 0;//统计个数 ListNode* tempnode = head; ListNode* temp = NULL; int prev = 0; while(tempnode) { ...
【数据结构】堆(C++)
堆概念
最大堆:最上面的结点数值最大
特点:1.每个结点最多可以有两个结点
2.根结点的键值是所有结点中最大的,每个结点的值都比孩子的值大。
3.除了根节点没有兄弟结点,最后一个左子结点可以没有兄弟结点,其他结点必须有兄弟结点。(有这个限制,下面的求子结点和父结点的公式才能成立。)
最小堆:最上面的结点数值最小….其他同最大堆
堆是最有个性的树,用数组表示的树。
在数组中快速创建堆左图——》右图
1.找到最后一个结点的父结点,(该父结点)与其子结点进行比较大小,若某个子结点大于父结点,则与该父结点交换位置。(就是从最后一个非叶子结点开始进行调整,(向下调整就是找到该父结结点的子结点,进行调整。))
2.再移动到前一个父结点,进行上述操作。
3……
补充:static修饰的全局函数
一个普通的全局的静态函数。. 这样的static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。
链接——链接
相关接口实现123456789101112131415161718192021222324252627 ...
按照二叉树每行的个数打印数组
这个b玩意儿耗了我2个小时,怎么tm就写不出来呢。
可能是吃的太饱了吧。
越写不出来一定要越冷静下来。
123456789101112131415161718192021222324252627282930313233343536int num = hp.size;int front = 0;int back = 1;int row = 1;while (num){ for (int j = front; j < back; j++) { cout << hp.arr[j] << " "; } cout << endl; num -= row;//输出完本行还剩的元素个数 //如果减去本行输出的个数小于0 if (num <= 0) { break; } row *= 2;//下一行要输出的元素个数 front = back;//定位下一行的起点 if (num - row <= 0)//如果当前的元素个数不够输出下一行的,直接定位下一行的back位置 ...
【数据结构】队列(C++)
队列队列是一种受限的线性表,它允许在一段进行删除操作,在另一端进行插入操作。
可以用数组实现,也可以用链表实现。
数组实现(顺序存储)设立一个队头指针front,一个队尾指针rear,分别指向队头元素和队尾元素,rear-front为元素个数。
(数组实现中,其实就是下标。)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121#define MAX_SIZE 10typedef int DataType;typedef struct Queue{ DataType queue[MAX_SIZE]; int front; i ...
【MySQL】Windows下安装MySQL
Windows下安装MySql安装下载链接——链接
选择第二个下载
点击图片左下角的蓝字直接进行下载。
下载完成,点击安装。
选择第一个,点击next。
点击Execulte
等待…然后点击next。
点击next。
点击next。
选择第一个,然后点next。
设置完密码,点击add user。
设置完成后,点击ok。
点击next。
默认,点击next。
点击Execute。
点击Finish。
点击next。
点击Finish。
点击next。
输入密码点击check测试。
点击next。
点击Execute
点击Finish,再点击next。
再次Finish。
弹出窗口。
启动方式一
方式二
管理员方式打开命令行。
1234停止net stop MySQL80开启new start MySQL80
配置相关环境变量
点编辑。
C:\Program Files\MySQL\MySQL Server 8.0\bin
LeetCode刷题(17)【中等】两数相加(C++)
2.两数相加
题目——链接
这题将两个val分开加到sum中更方便。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { /* 从前往后遍历链表,对应的结点乘以10的n次方 越高位越往后存,所以用尾插 */ //其中一个为空直接返回另一个 if(!l1) ...
LeetCode刷题(16)【简单】移除链表元素&&回文链表&&删除链表中的结点
203.移除链表元素链接——链接
12345678910111213141516171819202122232425262728293031class Solution {public: ListNode* removeElements(ListNode* head, int val) { if(!head) { return head; } //设置一个新的头结点指向head——就能解决 ListNode* Newhead = new ListNode; Newhead->next = head; ListNode* tempnode = Newhead; while(tempnode->next) { if(tempnode->next->val == val) { Lis ...
【数据结构】链表(C++)
链表链表是线性表的链式存储方式,逻辑上相邻的数据在计算机中的内存位置不必须相邻,给每一个元素 加一个指针域,指向下一个元素的位置。
如下图所示:
链表的核心要素:
每个结点由数据域和指针域组成
指针域指向下一个结点的内存地址
单链表链表的结点均单项指向下一个结点,形成一条单项访问的数据链。
相关接口实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015 ...
LeetCode刷题(15)【简单】删除链表中重复元素(C++)
83. 删除排序链表中的重复元素
题目——链接
单指针法1234567891011121314151617181920212223//一个指针往后遍历class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if(!head || !head->next) { return head; } ListNode* tempnode = head;//这个头结点里面好像有元素 while(tempnode->next) { if(tempnode->val == tempnode->next->val) { tempnode->next = tempnode->next->next; } ...
【数据结构】顺序表(C++)
顺序表顺序表是简单的一种线性结构,逻辑上相邻的数据在计算机中内的存储位置也是相邻的,可以快速定位第几个元素,中间允许有空值,插入、删除时需要移动大量元素。
顺序表的三个要素
用elems记录存储位置的基地址。
分配一段连续的存储空间size(可以存放的元素个数)。
用length记录实际的元素个数,即顺序表的长度(现在实际存放的元素个数)。
图示
代码实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394#define MAX_SIZE 100typedef int ElemsType;typedef struct _SqList{ ElemsType* elems; int length;//长度 int size;//容量}SqList;//初始化bo ...