随笔分类 -  慢慢学算法

递归反转栈的顺序-------只使用常数量个变量
摘要:昨天去阿里巴巴参加Java研发工程师的实习生面试,遇到的一个题目:我们要反转一个栈,如果使用另外一个栈作为辅助的话,那么反转起来很简单,一个接一个push到辅助栈里再push回来就行了。那么假如不能使用辅助栈,数组等空间为O(n)的数据结构,只使用O(1)的空间复杂度即只能有常数个变量,怎么实现将栈... 阅读全文

posted @ 2014-04-15 13:34 Allen Blue 阅读(3853) 评论(7) 推荐(1)

求连续子数组的最大和
摘要:题目来源:《剑指offer》面试题31,《编程珠玑》第八章,LeetCode OJ的Maximum Subarray。题目大意:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的最大和。例如,数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此返回的结果为子数组的和18.来自Google,微软等很多知名公司的面试题,2005年浙江大学计算机系的考研题的最后一道程序设计题,貌似是风靡一时的一道题。参考链接:程序员编程艺术:第七章、求连续子数组的最大和、程序员面试题精选100题(03)-子数组的最大和解题思 阅读全文

posted @ 2014-04-08 23:19 Allen Blue 阅读(216) 评论(0) 推荐(0)

再来看看快速排序
摘要:#include #include #include using namespace std;void quickSort(vector &vec,int l,int u){ int i , m; if( l>=u) return ; m = l; for(i = l+1; i vec){ vector::iterator it = vec.begin(); for(; it != vec.end(); it++) cout vec; for(int i = 1; i = u) return; 4 m = l; 5 f... 阅读全文

posted @ 2014-04-08 13:52 Allen Blue 阅读(272) 评论(0) 推荐(0)

【C++】大数的+-*/四则运算
摘要:所谓大数,则指数值特别大的数,可能会有99位,100位,远远超过了long long表示的范围。这样的数作四则运算,需要用到字符串。用字符串通过每一位的字符的四则运算来模拟。废话少说,上代码: 1 #include 2 #include 3 using namespace std; 4 5 class BigNum{ 6 vector m_vec; 7 //构造函数,析构函数,size()函数,友元重载>>,>(istream &is,BigNum &data); 23 24 public: 25 char operator[](int nInde... 阅读全文

posted @ 2014-04-07 16:50 Allen Blue 阅读(693) 评论(0) 推荐(0)

【各种排序系列之】归并排序
摘要:转载自:白话经典算法系列之五 归并排序的实现普通的合并两个数组的代码:O(n) 1 //将有序数组a[]和b[]合并到c[]中 2 void MemeryArray(int a[], int n, int b[], int m, int c[]) 3 { 4 int i, j, k; 5 6 i = j = k = 0; 7 while (i < n && j < m) 8 { 9 if (a[i] < b[j])10 c[k++] = a[i++];11 else12 c[k++... 阅读全文

posted @ 2014-04-01 21:18 Allen Blue 阅读(174) 评论(0) 推荐(0)

【各种排序系列之】快速排序法
摘要:基本思想:从待排序列中任取一个元素 (例如取第一个) 作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表。然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。此时便为有序序列了。时间效率:O(nlogn) —因为每趟确定的元素呈指数增加空间效率:O(logn)—因为递归要用栈(存每层low,high和pivot)C语言实现: 1 //首先定义数据类型 2 #define MAXSIZE 20 //示例的小顺序表的最大长度 3 typedef int KeyType; //定义关键字类型为整数类型 4 typedef struct { 5 ... 阅读全文

posted @ 2013-10-28 22:10 Allen Blue 阅读(296) 评论(0) 推荐(0)

【各种排序系列之】希尔排序法
摘要:基本思想:先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。优点:让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会高很多。技巧:子序列的构成不是简单地“逐段分割”,而是将相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩短(例如依次取5,3,1),直到dk=1为止。空间效率:void ShellSort(SqList &L,int dlta[ ],int t){//按增量序列dlta[0…t-1]对顺序表L作Shell排序。dk值依次装在dlta[t]中 for(k=0; 阅读全文

posted @ 2013-10-26 22:06 Allen Blue 阅读(329) 评论(0) 推荐(0)

【各种排序系列之】插入排序法
摘要:算法思想:在已形成的有序表中线性查找,并在适当位置插入,把原来位置上的元素向后顺移。//基于指针的插入排序/*假设有人想排序“eagle”,“cat”,“ant”,“dog”,“ball”这些字符串。使用基于指针的存储,即一个数组包含了指向实际信息的指针,而不是直接将信息存储在数组元素的存储空间里面。使用这种方式,可以灵活地存储和排序任意复杂结构的数据。*/void sortPointers(void **ar, int n, int(*cmp)(const void *, const void *))//对一个数组ar进行排序,并且其中的元素可以用提供的比较函数cmp进行比较{ int... 阅读全文

posted @ 2013-10-26 20:42 Allen Blue 阅读(123) 评论(0) 推荐(0)

【查找】二分查找法
摘要:先给数据排序(例如按升序排好),形成有序表。然后再将key与正中元素相比,若key小,则缩小至右半部内查找;再取其中值比较,每次缩小1/2的范围,直到查找成功或失败为止。问题:若关键字不在表中,怎样得知并及时停止查找?典型标志是:当查找范围的上界≤下界时停止查找。二分查找的时间效率是logN。 1 int search_bin(char *t,char k) 2 { 3 int low=1,high=10,mid; 4 while (low<=high) 5 { 6 mid=(low+high)/2; 7 if (k==t[mid]) r... 阅读全文

posted @ 2013-10-26 20:09 Allen Blue 阅读(166) 评论(0) 推荐(1)

导航