摘要: 1. 使用筛选法求素数的思想是:使用一个bool isPrime[N]来存储一个数是不是素数的标志位。 首先偶数不是素数(2除外),将2的倍数isPrime全部设置为false。 i从3开始遍历,如果i为素数,则将i的倍数isPrime全部设置成false。这样就筛选掉了好多不是素数的数。 从0遍历isPrime[i]数组,如果值为true,则说明i为素数,否则i不是素数。2. 代码如下: View Code 1 #include <iostream> 2 #include <cassert> 3 #include <cmath> 4 using names 阅读全文
posted @ 2012-08-08 15:28 kasuosuo 阅读(1238) 评论(0) 推荐(0) 编辑
摘要: l 并查集:(union-find sets)一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。l 并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x) 把每一个元素初始化为一个集合初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。2、Find_Set(x) 查找一个元素所在的集合查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。判断两 阅读全文
posted @ 2012-08-08 11:26 kasuosuo 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 1. 堆是一个完全二叉树,堆主要设计到的操作有插入,删除,堆化。2. 堆的主要应用有堆排序:从小到大排序,使用大顶堆;从大到小排序,使用小顶堆。3. 下面以大顶堆为例,给出实现代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 //大顶堆的实现 7 class Myheap 8 { 9 public: 10 Myheap(int hSize=DefaultSize) 11 { 12 if (hSize>DefaultSiz... 阅读全文
posted @ 2012-08-07 17:14 kasuosuo 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 1. 位图主要是为了节省空间,如一个整数有32位,那么可以用这个整数的32位来表示32个整数。2. 实现代码如下:View Code 1 #include<iostream> 2 #include <fstream> 3 #include <cassert> 4 5 using namespace std; 6 7 #define INT_BITS sizeof(int) 8 #define SHIFT 5 //2^5=32 9 #define MASK 0x1f //3110 #define MAX 1024*1024*1024 //可以表示的最大整数11 阅读全文
posted @ 2012-08-07 13:24 kasuosuo 阅读(767) 评论(0) 推荐(0) 编辑
摘要: 参考文章:http://www.leetcode.com/2010/11/unique-paths.html 题目描述:给定一个m×n的方格,求方格(1,1)到点(m,n)的路径条数。路径只能向右或向下走。 文章中给出了三种算法: 算法1:最容易想到的也是最原始的回溯搜索算法,递归实现回溯。 算法2:由于在1回溯过程中,会做很多次重复计算。为了减少重复计算,使用动态规划中的备忘录算法,将已经计算出的值保存在数组中,使用这些值计算新的值。 算法3:自底向上的动态规划算法,也是最简洁的算法。 数学公式:高中排列组合的一道题,C(m+n-2,m-1)=C(m+n-2,n-1) 代码... 阅读全文
posted @ 2012-07-27 20:09 kasuosuo 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 1. 参考文章http://www.leetcode.com/2011/08/insert-into-a-cyclic-sorted-list.html2. 测试代码View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 struct Node 7 { 8 int data; 9 Node* next;10 Node(int x)11 {12 this->data=x;13 this->next=NULL;14 ... 阅读全文
posted @ 2012-07-23 10:57 kasuosuo 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 1. 参考文章http://www.leetcode.com/2011/09/regular-expression-matching.html2. 代码View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 7 //递归很重要 8 bool isMatch(const char* sor,const char* des) 9 {10 assert(sor && des);11 //到达字符串末尾12 if (*des=='\0')1 阅读全文
posted @ 2012-07-21 10:23 kasuosuo 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 1. 参考文章http://www.leetcode.com/2011/11/longest-palindromic-substring-part-i.html2. 文章中阐述了五种方法 (1)将str反转然后得到rstr,然后求str和rstr的最长公共子串。每次得到一个最长公共子串候选,还需要对子串下标和反转子串的原始下标进行判断,看是否相等:相等则得到的是合理的回文串;否则不合理。如果求最长公共子串使用DP算法,则时间复杂度为O(N2),空间复杂度为O(N2);如果采用广义后缀树(GST),则时间复杂度为O(2N)(具体算法还没细看)。 (2)暴力搜索,时间复杂度为O(N3)(代码中.. 阅读全文
posted @ 2012-07-19 16:59 kasuosuo 阅读(1735) 评论(0) 推荐(0) 编辑
摘要: 首先有以下几个问题需要考虑:1. 负数是不是回文数?这里假设负数不是回文数。2. 如果要求不能用额外的存储空间怎么办?下面的代码给出四种方法:View Code 1 #include <iostream> 2 #include <cassert> 3 #include <limits> 4 #include <numeric> 5 #include <string> 6 using namespace std; 7 8 long long reverseNumber(int number) 9 { 10 assert(number&g 阅读全文
posted @ 2012-07-18 21:06 kasuosuo 阅读(1183) 评论(0) 推荐(0) 编辑
摘要: 1. 求一组随机数中的最大值和最小值最少比较次数为3n/2-2取上整次,即大于等于3n/2-2的最小整数次。 当n为偶数时,为3n/2-2 当n为奇数时,为3n/2-3/22. 算法如下。第一步,将这组数据两两比较,将小数置于数组前半部分,大数置于数组后半部分。如果n为偶数,此次比较次数为n/2;如果n为奇数,此次比较次数为(n-1)/2,中间的那个数不做比较。第二步,在数组的前半部分进行比较找到最小的数;在数组的后半部分比较找到最大的数。如果n为偶数,总共比较次数为(n/2-1)×2次;如果n为奇数,比较次数为((n-1)/2-1)×2次。第三步,如果n为奇数,将数组中间 阅读全文
posted @ 2012-07-17 15:49 kasuosuo 阅读(1179) 评论(0) 推荐(0) 编辑