Algorithm
文章平均质量分 61
renwotao2009
努力程度之低,离拼天赋还远的很
展开
-
图的拓扑排序
图的基本算法-拓扑序列拓扑排序拓扑排序基本算法代码示例拓扑排序对于一个有向无环图,简称DAG(Directed Acyclic Graph),进行拓扑排序就是将图中所有的定点排成一个线性序列,使得图中任意一对定点u和v,若边<u,v>则u在拓扑排序中出现在v之前。这样的序列成为满足拓扑次序的序列成为拓扑排序。拓扑排序基本算法对于一个有向无环图:找到入度为0的顶点,可能有多个...原创 2020-03-29 18:11:44 · 526 阅读 · 0 评论 -
约瑟夫环
约瑟夫环约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解。一般的解决方法直观上,通过循环链表非常的简单,只需要循环删除指定节点就原创 2016-10-31 15:41:38 · 906 阅读 · 0 评论 -
基础算法-归并排序
原理归并排序是稳定的排序算法,其时间复杂度为O(lgN),空间复杂度为O(N)。算法步骤使用分治法进行归并排序。 纸面上二路归并算法: 一、有序列{a1, a2, a3,…an},二分法得到两个序列{a1, a2,… ak}和{ak+1,… an},其中k=(1+n)/2; 二、同理,这两个子序列分别进行二分得到新的4个序列,直到划分成{a1},{a2}… {an}个序列为止。 三、{a1}原创 2016-04-06 18:42:53 · 744 阅读 · 0 评论 -
求a的b次方根
牛顿迭代法 算法数学依据原创 2016-10-31 11:35:54 · 1621 阅读 · 0 评论 -
实现push,pop,max为O(1)的栈
原理使用两个栈来实现要求: 栈的push,pop,max都为O(1)。一个栈用来保存入栈数据中的最大值另一个栈用来正常保存入栈和出栈的数据,它max方法用来调用第一个栈保存的当前最大值实现辅助栈作用:用于保存当前最大值的栈template<typename T>class stackMax{public: stackMax():size(0), capacity(1), data原创 2016-11-10 20:08:12 · 1414 阅读 · 0 评论 -
LRU cache 算法的实现
#什么是LRULRU Cache是一个Cache置换算法,含义是“最近最少使用”,当Cache满(没有空闲的cache块)时,把满足“最近最少使用”的数据从Cache中置换出去,并且保证Cache中第一个数据是最近刚刚访问的。由“局部性原理”,这样的数据更有可能被接下来的程序访问。原创 2016-11-07 15:16:32 · 6236 阅读 · 0 评论 -
基础算法-直接选择排序
原理直接选择排序也分为有序区和无序区,通过每一次比较得到无序区的最小元素放到有序区,直到无序区没有元素。步骤1 对于序列{a1, a2, a3, a4… an}我们分别划分成两个区域,无序区{}和有序区{a1, a2, a3, a4… an}。2 得到无序区的最小元素ax,放到有序区{ax},判断无序区{a1, a2, … a(x-1), a(x+1)…an}是否还有元素,如果有则继续步骤2;没有则原创 2016-03-27 20:52:08 · 989 阅读 · 0 评论 -
重建二叉树
重建二叉树根据前序遍历序列和中序遍历序列重建二叉树/* * 二叉树重建辅助函数 * preorder: vector<int>,前序序列 * inorder : vector<int>,中序序列 * idx : int, 当前树的根节点的在前序序列中的索引 * start : int, 当前树在中序序列中开始的索引 * end : int, 当前树在中序学列中结束的原创 2016-11-08 10:08:31 · 745 阅读 · 0 评论 -
字符串-回文判断
回文判断回文的两种解法解法1从字符串的两边向中间判断字符串是否是回文。bool isPalindrome(string s) { if (s.empty()) return false; int l = 0, r = s.size()-1; while (l < r) { if (s[l] != s[r]) return false原创 2016-10-17 22:56:35 · 734 阅读 · 0 评论 -
DFS、BFS和Backtracking模板
搜索问题的解法DFS(深度优先搜索)BFS(广度优先搜索)backtracking(回溯)DFS模板void dfs(...) { // 结束递归的条件 if (...) { ..... // 把“当前结果” 加入 “结果集容器” 中 return; } // 继续递归,里面可能有回溯,也可能没有 if (...) {原创 2016-11-01 11:33:20 · 2255 阅读 · 0 评论 -
二叉排序树
二叉排序树二叉排序树(BST)又称“二叉查找树”、“二叉搜索树”。二叉排序树的性质是一颗空树具有下列性质的二叉树 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值若它的有字数不空,则右子树上所有节点的值均大于它的根节点的值它的左、右子树也分别为二叉排序树二叉排序树的实现// 二叉排序树使用二叉链表作为存储结构typedef struct BNode { in原创 2016-06-30 09:37:14 · 971 阅读 · 0 评论 -
平衡二叉树
AVL树的简介AVL树(即平衡二叉树)是自平衡的二分查找树。在AVL树中任何节点的两个子树的高度差值为一。因此,它也是一个棵在二分查找树(BST)且为二分查找树的改进版。特点AVL树以一棵二分查找树(BST)自平衡:每个节点的左右子树高度相差绝对值不超过1AVL树的实现// avl树节点的定义typedef struct AvlNode { int key;原创 2016-07-10 22:04:09 · 369 阅读 · 0 评论 -
数字转化为16进制数
leetcode:https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/思路1:数组hash存储string hex=“0123456789abcdef”;排除0先考虑num大于0的数,实现非常简单考虑num小于0的数,负数存储最高为1,且INT_MIN的绝对值等于INT_MAX+1,那么需要对INT_MIN做...原创 2019-04-16 22:12:28 · 3916 阅读 · 0 评论 -
DP-House Robber
House RobberHouse Robber 题目大意: 一个小偷准备偷窃一条街道上的房屋,但这些房屋中任意相邻的房屋在同一夜被偷盗,那么就会自动报警。每个房屋中可偷盗的物品价值不一样,如果你是一名窃贼,怎么在同一夜中偷窃物品价值最大而不触发报警装置?分析什么样的最优化问题适合使用DP如何判断一个问题是否可用动态规划算法求解?下面是引用《算法导论》中什么问题才能使用DP的论述: 《算法导原创 2016-11-26 16:26:26 · 714 阅读 · 0 评论 -
基础算法-计数排序
计数排序计数排序要求所有元素都是0到k之间的整数(注:必须确定知道最大值k)。基本思想数列中小于等于元素a的个数为n,则直接把a放到第n-1个位置(注:索引从0开始)。代码/* * src[] : int, 待排序的整型数组 * dst[] : int, 返回已排序的整型数组 * size : int, src和dst数组的大小 * k : int, src数组中最大值k*/ void原创 2016-11-22 17:23:01 · 712 阅读 · 0 评论 -
赛车进站问题
假设一场赛车比赛中需要跑 n 圈,而某赛车最多跑 3 圈就需要进站加油继续跑,请问有多少种进站策略。分析跑 n 圈加油的策略函数getCount(n)如下:当 n = 0 时,返回值为 0;赛车不跑圈,则没有进站策略。当 n = 1 时,返回值为 1;赛车跑1圈,则进站加油和不加油都可以,其策略只能为1。当 n = 2 时,返回值为 2;赛车跑2圈,第1圈跑完进站加油或不加油两种选择,跑完第2原创 2016-10-09 22:02:00 · 822 阅读 · 0 评论 -
实现一个简单的HashTable
实现一个简单的HashTable,包括以下三个接口:put,get ,delete。基本原理哈希表的基本概念哈希表就是一种以 键-值(key-indexed) 存储数据的结构,只要输入待查找的值即key,即可查找到其对应的值。哈希函数是一种映射f(key) = index,多个key可以映射到一个index上,这在哈希表存储时产生冲突。哈希函数可以迅速计算出key对应哈希表数组中的索引,但无法避免冲原创 2016-11-15 16:40:42 · 3005 阅读 · 0 评论 -
关于滚动数组
Minimum Path SumGiven a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.普通的DP解决方案 DP的4个基本要素: 状态(State)原创 2016-11-19 21:16:10 · 937 阅读 · 0 评论 -
基础算法-交换排序
基本算法排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常用算法的复杂度和稳定性:交换排序使用交换方式排序的两种排序算法有冒泡排序和快速排序冒泡排序基本原理每一个相邻的元素进行比较,较大的元素放置后面,第一趟比较结束可把最大的元素放置到最后一位,第二趟比较结束可把第二大的元素放置到紧挨着最大元素的位置…原创 2016-03-23 10:56:07 · 1021 阅读 · 3 评论 -
单链表存在环的问题
问题给定一个单链表,只给出头指针header判断链表是否存在环 求环的长度 求环的连接点求带环链表的长度// 简单的链表定义及生成带环链表函数typedef struct Node { struct Node *next;} node;node* makeNode() { node * pNode = (node*)malloc(sizeof(node原创 2016-04-10 10:07:53 · 1470 阅读 · 0 评论 -
二叉树的构造和遍历
二叉树的构造// 二叉树节点定义typedef struct BNode{ char data; BNode *left; BNode *right;} BNode, *BTree;// 创建二叉树int creatBTree(BTree &tree){ char data; cin >> data; if (data == '#') //原创 2016-05-28 22:49:37 · 3064 阅读 · 1 评论 -
贪心算法
找零钱问题the problem of “Making Change”.Coins available are:dollars (100 cents) quarters (25 cents) dimes (10 cents) nickels (5 cents) pennies (1 cent)#include #include #include using names原创 2016-10-17 10:14:24 · 691 阅读 · 0 评论 -
给定一个字符串,求出其最长的重复子串的长度
题目来源:这是编程珠玑上的一道题目概念字符串的前缀和后缀例如字符串 s =“abcdeabc” 则s的前缀: “a”,“ab”,“abc”,“abcd”,“abcde”,“abcdea”,“abcdeab”,“abcdeabc”其中除了s字符串本身(“abcdeabc”)之外,其他的前缀为s的真前缀。s的后缀: “abcdeabc”,“bcdeabc”,“cdeabc”,“deabc”,“ea原创 2016-11-05 11:55:55 · 18181 阅读 · 2 评论 -
图的表示法
要表示一个图G=(V,E)(注:V:vertex、E:edge),有两种方法,即邻接表和邻接矩阵。这两种方法既可以用于有向图,也可以用于无向图。// 图11 ----- 2| | \| | / 35 ----- 4邻接表邻接表表示法通常表示稀疏图(图中 |E| 远小于 |V|^2)比较紧凑。// 邻接表数据结构// 定义图中最多100个节顶点#define MA原创 2016-06-13 21:58:08 · 836 阅读 · 0 评论 -
判断两个链表是否相交并找出交点-笔记
判断两个链表是否相交的方法 相交链表的特征:如果两个链表相交,那么交点以后的节点都相同,否则不相交。1 暴力搜索法这个地球人都懂得2 节点hash法两个链表的节点进行hash,然后判断节点hash值和节点的值是否相等来判断。 不推荐这样做,每个节点进行hash,然后判断,程序上比较累赘。若要实现,可以参考Java中HashMap的源码实现。3 链表衔接法一个链表的尾部连接下一个链表的头部,通过判原创 2016-04-12 21:50:23 · 3297 阅读 · 0 评论 -
八皇后
八皇后问题是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。// 简单粗暴的算法public class eightQueens { public static void main(String[] args) {原创 2016-03-21 15:36:55 · 849 阅读 · 0 评论 -
最大公约数
什么是最大公约数 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。辗转相除法求最大公约数由参考资料可知,辗转相除法是计算机实现求解最大公约数最为简便的方法。 辗转相原创 2016-03-18 11:21:38 · 1243 阅读 · 0 评论 -
基础算法-桶排序
原理设数组中要排序的数字有n个,为十进制数即r=10(这里RADIX=10)即十个桶其索引为0~9,数字的最大长度为k即数字最大k位十进制数,设置每个桶可装载d个数字(这里BUCKETSIZE=100)。 步骤一:使用最低位优先法,取每个数字的最低位数字当做索引,分别放置到对应索引的桶中,即桶排序分配过程。 步骤二:从索引0~9的桶中依次(先进先出)拿出数字,并放置到原数组中,即桶排序的收集过程原创 2016-03-31 21:15:50 · 767 阅读 · 0 评论 -
基础算法-插入排序
插入排序直接插入排序// 直接版void insertSort(int a[], int n) { for (int i = 1; i // i表示要插入元素的索引,在插入过程中不能改变 int key = i; // key表示插入元素在插入过程中的索引,可能随时改变 for (int j = i-1; j原创 2016-03-25 20:41:50 · 608 阅读 · 0 评论 -
Bitmap 算法解释与应用
有这样一个问题:给40亿个不重复的unsigned int的整数,没排序。再给一个数,快速判断这个数是否存在40亿个整数中?内存限制2G。40亿个数,我们先看内存占用:(40亿*4)/1024/1024/1024=14.9G (int 占4字节32bit),所以用传统的内存排序肯定不可以。 这里要用到Bitmap算法,Bitmap就是用一个bit位来映射某个元素的value值,key则是该元素值转载 2016-06-14 11:19:08 · 818 阅读 · 0 评论 -
图的基本算法
图的广度优先搜索构造和初始化图使用图的表示法章节中的代码// 创建简单循环队列// Queue.hifndef QUEUE_H#define QUEUE_H#define QUEUE_SIZE 5int Queue[QUEUE_SIZE] = {0};int start = 0;int qSize = 0;void EnQueue(int vertex) {原创 2016-06-25 11:02:00 · 746 阅读 · 0 评论 -
二分查找
代码二分查找查找key的下标// 二分查找的迭代版本/* 注:如果数组索引使用整数求mid时,l+h可能发生溢出*/int binarySearch(int a[], int n, int key) { int l = 0; int h = n-1; int mid; while (l <= h) {原创 2016-07-08 14:15:38 · 445 阅读 · 0 评论 -
基础算法-堆排序
原理堆排序(从小到大)的实现主要利用大顶堆的特征,取全堆最大值(即根节点即根节点与最后的叶节点的值做交换)放置到有序的序列中,然后,除根节点的其余节点继续建立大顶堆,直到所有节点都被取走。大顶堆的特征在二叉树中,父节点的值大于其左右孩子节点的值。建大顶堆的过程堆由数组这种来存储,其本质是完全二叉树。 设堆a[n] = {a1, a2, … an}; 注:索引从0开始 由二叉树的性质可知:索引为原创 2016-03-29 20:53:23 · 764 阅读 · 0 评论 -
全排列
全排列给出一个字符串或整数数组,对这个字符串或整数数组进行全排列 例如:{1, 2, 3} 数组,对这个整数数组进行全排列。递归实现实现template <typename T> inline void swap(T* array, unsigned int i, unsigned int j) { T t = array[i]; array[i] = array[原创 2016-09-03 11:53:14 · 1034 阅读 · 0 评论 -
快速幂求x的n次方
递归版 非递归版原创 2016-10-18 10:19:30 · 4474 阅读 · 0 评论 -
判断字符串有重复字符
题目判断英文字符串中有重复字符代码#define BOOL int#define TRUE 1#define FALSE 0int arr[256] = {0};BOOL check1(char *str){ size_t len = strlen(str); if (len > 256) return TRUE; size_t i; fo原创 2016-07-30 17:11:32 · 1357 阅读 · 0 评论 -
Merge Two Sorted Lists-满满的套路
leetcode-21Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists不带头结点的版本实现/** 1. Definition for singly-linked lis原创 2016-09-03 17:23:42 · 444 阅读 · 0 评论 -
BFS的应用
BFS在二叉树上的应用二叉树的层次遍历// 一颗二叉树 1 / \ 2 3 / \ / \ 4 5 6 7 // 按照层次遍历的要求,把结果输出到一行中void levelTraverse(BTree tree){ queue<BTree> qTree; if (tree)原创 2016-09-13 09:44:23 · 792 阅读 · 0 评论 -
如何判断一个数是否是完全平方数
完全平方数? 首先,背下1-20的平方数,因为常用。 然后牢记以下规律: 完全平方数,凡是个位为0的,其平方根个位必为0 完全平方数,凡是个位为1的,其平方根个位必为1或9 完全平方数,凡是个位为4的,其平方根个位必为2或8 完全平方数,凡是个位为5的,其平方根个位必为5 完全平方数,凡是个位为6的,其平方根个位必为4或6 完全平方数,凡是个位为9的,其平方根个位必为3或7 然后,对于转载 2010-04-11 12:19:00 · 3734 阅读 · 0 评论 -
关于斐波那契数列
斐波那契数列代码1// 分分钟写出来的代码int fab(int n){ if (n == 0 || n == 1) return n; return fab(n-1) + fab(n-2);}分析代码1递归使整个代码非常简洁,然而代码是有问题的考虑n值特别大的情况,上万的一个值,递归可能使栈溢出,递归调用是非常耗时的操作,可是原创 2016-07-21 18:47:20 · 641 阅读 · 0 评论