
常用经典算法
文章平均质量分 59
CodeEvil
这个作者很懒,什么都没留下…
展开
-
线索二叉树
线索二叉树就是把普通二叉树所有的空指针给利用了,如果左孩子指针为空,则让它指向前驱节点,如果右孩子为空,则指向后继(不同的遍历方法前驱后继不一样,一般是用中序遍历),但是有个问题就是需要知道左右孩子指针所指的节点究竟是前驱后继,还是说左右孩子,这时可以用ltag和rtag两个bool变量来判断,如果ltag=false则指的左孩子,为true则指向前驱,rtag类似。重写结构体如下:typed原创 2018-01-13 21:29:38 · 211 阅读 · 0 评论 -
KMP算法原始版与优化
void GetNext(string pattern,int* &next){ int length = pattern.length(); //*前后缀相等的长度越大意味着在该位置回退回去的距离越短,效率越低,next数组内的数字代表当前不匹配,用该数字索引对应的字符重新匹配 next = new int[length]; int k = -1, j = 0; //k代表...原创 2018-01-01 00:07:52 · 337 阅读 · 0 评论 -
floyd算法求多源最短路径
关于floyd三重循环的问题可能有人有疑问:为什么k要放在在外层循环,这个牵扯到动态规划的问题,状态转移方程为dist[k][a][b] = min(dist[k-1][a][k] + dist[k-1][k][b] , dist[k-1][a][b]),当多使用了一个中间节点k来更新ab间距离的时候,需要知道k-1的时候对应的所有的ab间距,才能推导出新增k节点之后的所有ab间距,所以要把k=1原创 2017-12-30 22:27:56 · 227 阅读 · 0 评论 -
硬币找零问题
硬币找零问题1:给定几种硬币的面值,每种硬币数目无限多,给定一个数值,求出用这些已有的硬币加起来组成的价值等于这个数值的所有组合情况可以用回溯思想来解决此问题,加入硬币为{1,2,5},目标是组成10,我刚开始是想用递归解决,每递归进去一层,都重新从1,2,5中选取一个数,加上之前累加得到的数,判断是否大于或等于10,这个思路是有问题的,会造成重复,比如某次挑选的路径为1,2,5,后来还会出现原创 2018-01-07 15:43:08 · 2141 阅读 · 0 评论 -
完全背包问题的分析与优化
完全背包问题跟01背包的区别是01背包每个物品只能选一次,总共就这几个,而完全背包问题是每个物品可以无限选,只要装得下。可以看成是有几种物品,每种都无限多个。如何根据01背包问题的分析成果来分析完全背包呢?其实很简单,.01背包在选第i个物品时,容积够用情况下,只有2种状态可选,放还是不放,找出最大价值的选择而完全背包在选第i种物品时,容积够用情况下,可能有2种以上状态可选,放1个,或者2个,3个...原创 2018-01-06 22:11:05 · 6908 阅读 · 6 评论 -
01背包问题的分析与优化
背包问题是动态规划的经典问题,可以分为多个子结构,如,只使用第1个物品在背包容量为1的情况下背包所能装的最大价值:为V[1][1]只使用第1个物品在背包容量为2的情况下背包所能装的最大价值:为V[1][2]只使用第1个物品在背包容量为j的情况下背包所能装的最大价值:为V[1][j]只使用第1,2个物品在背包容量为j的情况下背包所能装的最大价值:为V[2][j]只使用第1,2,3...i 个物品在背...原创 2018-01-06 21:40:59 · 5801 阅读 · 9 评论 -
Trie树(字典树)
hihocoder的题就有这个,这里主要写了创建与查找,查找用了两种方式,迭代与递归#include#includeusing namespace std;typedef struct trieTree{ char word = 0; int counts = 0; struct trieTree* children[26] = {0}; //26个小写字母}Trie;原创 2018-01-07 21:09:52 · 183 阅读 · 0 评论 -
kruskal与prim最小生成树算法
以下代码未经验证:#include#includeusing namespace std;#define MAXINT 0xffff#define vertexNum 10typedef struct Graph{ int border[vertexNum][vertexNum];}Graph;typedef struct border{ int v1; //第一个原创 2018-01-13 23:43:06 · 221 阅读 · 0 评论 -
二叉树的存储,创建,以及四种遍历,删除
#include ;#include ;using namespace std;typedef char DATA;typedef struct BitTree{ DATA data; BitTree *lChild, *rChild;}BitTree, *BitNode;class CBitTree{public: BitTree* node; CBitTree()原创 2017-12-28 14:11:39 · 250 阅读 · 0 评论 -
二叉排序树的创建,插入,遍历,节点删除,整个删除的封装
#includeusing namespace std;typedef struct BSTree{ int key; struct BSTree *LChild , *RChild;}BSTree;class CBSTree{private: BSTree *root; //二叉排序树的根节点,可以代表一个树 bool SearchKey(int key,BSTree原创 2018-01-04 13:13:07 · 731 阅读 · 0 评论 -
图的存储(邻接表)创建与深度优先、广度优先搜索
#pragma once#include#includeusing namespace std;#define Vnum 10typedef int DATA;/*邻接表存储图*/typedef struct list //存储链表的结构{ int weight; //边 int index; //顶点数组的索引 struct list *nextList; //链表的原创 2017-12-30 20:22:01 · 903 阅读 · 0 评论 -
dijkstra算法求单源最短路径
利用dijkstra算法求单源最短路径。原创 2017-12-26 18:52:19 · 469 阅读 · 0 评论 -
汉诺塔问题的解决思路及算法
关于汉诺塔问题,好多时候当时理解了过段时间可能又会忘,其实这个代码很简单,主要还是分治思想理解不够透彻。架设3根柱子分别为A、B、C,圆盘数目为n。1:如果A有一个圆盘,则直接移动至c。2:如果A有2个圆盘,则A->B,A->C,B->C。好了这个时候已经可以解决问题了,结束条件为 n==1;假设当我们在数目为n-1的时候已经解决了移动问题可以成功移动至C,如果又多了一个呢,即原创 2017-12-31 21:25:27 · 20130 阅读 · 0 评论 -
马踏棋盘算法
#includeusing namespace std;#define X 6#define Y 6int chess[X][Y] = { 0 };bool visited[X][Y] = { 0 };typedef struct state{ int x; int y;}STATE;STATE state[8] = //用来描述8个状态的切换{ { 1, 2 }, {原创 2018-01-01 14:24:48 · 282 阅读 · 0 评论 -
10进制转2进制问题
其实在计算机的逻辑里,只有2进制,10进制转2进制的意思是把计算机展示给我们的10进制(数字)转换为 2进制(字符串)。既然写转换,就写个优雅简洁的代码,号称史上最简(贱)。void ten2two(int num){ while(num) { cout<< (num & 1 ?1 : 0); num >>= 1; }}原创 2017-12-27 12:41:52 · 296 阅读 · 0 评论 -
快速排序算法
快速排序算法的思想就是从数字序列中随便挑一个数,然后比跟剩余元素逐个比较,比它小的放在它的左边,比它大的放在它右边,然后这个数的位置就坐定了,然后分别取这个数左边的所有元素组成的新序列,还有右边的新序列,也就是左序列和右序列。用以上方法来递归实现。但是为了不浪费空间,总不能真的每个左序列和右序列都重新创建一个新的数组,可以通过记录原序列中的左序列右序列起始位置与结尾位置来实现,至于2个位置元素的交...原创 2017-12-27 12:56:09 · 136 阅读 · 0 评论 -
归并排序算法理解
归并排序算法的思想:把一个序列拆分成一对序列,每个序列再次拆分,这样经过多次拆分,拆分成多个小序列,每个序列有2个以内的元素然后排序,再逐次把1对有序序列合并为一个有序序列,最后合并为一个完整的有序序列。void merge(int *data,int startIndex,int endIndex);void mergeSort(int *data,int startIndex,int原创 2017-12-27 13:59:57 · 222 阅读 · 0 评论 -
获取给定字符串最长不重复子串
一开始的思路就是暴力解决法:获取所有的子串,写一个可以判断字符串是否有重复字符的函数,来排除重复字符串的可能,没找到一个无重复字符的子串,记录长度,找出最大长度的子串即可,这里只记录最大长度:class Solution { public boolean isRepeat(char[] subStr, char curChar, int length) { bool...原创 2018-03-27 21:24:58 · 1380 阅读 · 1 评论