
算法
文章平均质量分 74
yzl11
付出往往要>回报
展开
-
以空间换时间计算Fibonacci数列
先来看一下Fibonacci序列的定义:F(n) = 1, n = 0 或 1F(n) = F(n - 1) + F(n - 2) n > 1一般情况下,我们都喜欢采用递归方法计算Fibonacci数列,像下面这样的代码:int f(int n){ if(n <= 1) { return 1; } return转载 2015-10-26 10:11:06 · 577 阅读 · 0 评论 -
Rabin-Karp字符串查找算法
Rabin-Karp字符串查找算法原创 2015-12-10 16:51:54 · 409 阅读 · 0 评论 -
list的一种实现
template class List{private: struct Node { Objeect data; Node *prev; Node *next; Node(const Object &d = Object(), Node *p = NULL, Node *n = NULL) : data(d), prev(p), next(n) { } };原创 2015-11-02 16:01:36 · 312 阅读 · 0 评论 -
vector的一种简单实现
template class Vector{public: explicit Vector(int initSize = 0) : theSize(initSize), theCapacity(initSize + SPARE_CAPACITY) { objects = new Object[theCapacity]; } Vector(const Vector &rhs) :原创 2015-11-02 12:32:37 · 362 阅读 · 0 评论 -
基本递归和尾递归
基本递归 先看一下计算n的阶乘的定义式: n! = (n)(n-1) (n-2)...(1) 使用递归可以将其表达成: F(n) = 1 如果 n=0, n=1 F(n) = nF(n-1) 如果 n>1 实现代码如下:int fac原创 2015-10-28 16:06:53 · 1255 阅读 · 0 评论 -
查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素原创 2015-11-12 08:45:15 · 524 阅读 · 0 评论 -
单链表反转的两种方法
struct ListNode{ int m_nKey; ListNode* m_pNext;};迭代法:ListNode* ReverseIteratively(ListNode* pHead){ ListNode* pReverseHead = NULL; ListNode* pNode = pHead; ListNode* pPrev = NULL; while(原创 2015-11-12 08:26:56 · 579 阅读 · 1 评论 -
把字符串转换成整数
enum Status { kValid = 0, kInvalid };int g_nStatus = kValid;int StrToInt(const char* str){ g_nStatus = kInvalid; long long number = 0; if(str != NULL && *str != '\0') { bool minus = false;转载 2015-10-27 15:31:24 · 518 阅读 · 0 评论 -
求1+2+...+n的n种方法
一、利用构造函数求解这种方法本质上还是利用循环来完成。循环只是让相同的代码重复执行n遍而已,我们完全可以不用for和while来达到这个效果。比如我们先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数将确定会被调用n次。我们可以将与累加相关的代码放到构造函数里。如下代码正是基于这个思路:class Temp{public: Temp() { ++N; Sum原创 2015-10-27 10:16:00 · 3103 阅读 · 0 评论 -
不用加减乘除做加法
首先我们分析一下十进制加法是如何计算的,比如是如何得出5+17=22这个结果的。一般可以分成3步进行:1)只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);2)做进位,5+7中有进位,进位的值是10;3)把前面两个结果加起来,12+10的结果是22,刚好5+17=22。 然后我们分析下这种方法对于二进制是否也有效。5的原创 2015-10-27 13:18:21 · 592 阅读 · 0 评论 -
树中两个结点的最低公共祖先
一棵树如下图所示:假设要找到结点F和H的最低公共祖先。首先我们得判断A的子树中是否同时包含结点F和H,得到的结果为true。接着我们再先后判断A的两个子结点B和C的子树是不是同时包含F和H,结果是B的结果是true而C的结果是false。接下来我们再判断B的两个子结点D和E,发现这两个结点得到的结果都是false。于是B就是最后一个公共祖先。当我们判断以结点A为根的树中是否含有结点原创 2015-10-27 15:52:25 · 602 阅读 · 0 评论 -
快速排序
此算法将列表元素一分为二:一部分为小于”基准“元素的列表,一部分为大于”基准“元素的列表;待列表分割后,算法又在每个较小的列表上重复这一过程。快速排序的实现:void quick_sort(int* array, int lower, int upper){ int tmp; int mid = (upper+lower)/2; int pivot = array[mid]; int原创 2015-10-29 19:08:17 · 488 阅读 · 0 评论