上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 43 下一页
摘要: 后序遍历非递归是三种里面最难的,难处在于要判断是否左右子树都已经访问完毕。有两种方式,一种是用0和1记录当前节点是从左节点返回还是从右节点返回。空间O(n)http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810055.html另一种是维基百科... 阅读全文
posted @ 2013-11-11 22:46 阿牧遥 阅读(269) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1063/这题是贪心+堆。主要想练习一下堆的写法。算法导论里的方法名是heapify()等,但大家经常用更直观的down(), up()方法(向上,下调整),根据这两个方法,可以有build,insert,getmin方法。向下调整的代码稍微需要判断一下左右子树是否越界,其他都很简单。#include using namespace std;#define LEN 10005int num[LEN];int size;void swap(int a, int b) { int tmp = num[a]; num[a] = num[... 阅读全文
posted @ 2013-11-10 22:46 阿牧遥 阅读(265) 评论(0) 推荐(0)
摘要: 这是一个经典的单调序列的使用。单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作:1、入队:如果当前元素要进队,把当前元素和队尾元素比较,如果当前元素小于队尾元素,那么当前元素直接进队,如果当前元素大于队尾元素,那么队尾出队,将当前元素和新的队尾再做比较,直到当前元素大于队尾元素或者队列为空。单调队列只能在队尾插入元素,队尾和队头都可以删除元素。2、出队:出队直接取队头即可,因为用单调队列就是为了取最值,而队头就是最值。因为每个元素都出队列进队列一次,而且进出没有多余的比较,所以平摊下来是O(n)的 阅读全文
posted @ 2013-11-10 21:20 阿牧遥 阅读(219) 评论(0) 推荐(0)
摘要: STL六大组件1.容器(container):各种数据结构,如vector,list,deque,set,map等 2.算法(algorithm):各种常用算法如sort,search,copy,erase等 3.迭代器(iterator):扮演容器与算法之间的胶着剂。所以STL容器都附带有自己专属的迭代器。指针也是一种迭代器。 4.仿函式(functors):行为类似函数,可作为算法的某种策略,从实现的角度讲,仿函式是一种重载了operator()的class或class template。5.适配器(adaptor):一种用来修饰容器或仿函式或迭代器接口的东西,有function adap 阅读全文
posted @ 2013-11-04 22:28 阿牧遥 阅读(361) 评论(0) 推荐(0)
摘要: 一开始看到题还以为要DFS还是BFS,后来发现完全不用。排个序,然后看看大小王能不能弥补缺口就行,但后来又发现还要排除有相同大小牌的情况。#include #include #include using namespace std; int main() { int n; while (cin >> n && n != 0) { vector cards; int kingCount = 0; while (n--) { int x; cin >> x; if (x == 0... 阅读全文
posted @ 2013-11-03 22:24 阿牧遥 阅读(136) 评论(0) 推荐(0)
摘要: 刚开始还在想双指针,完全没必要。然后最土的可以扫两遍O(n),用一个数组记录出现次数。然后想到如果数组里记录出现的位置,可以只扫一遍O(n),第二遍扫字符集就行了。#include #include using namespace std; #define INF 1> s) { int len = s.length(); if (len == 0) { cout count[i] && count[i] != -1) min = count[i]; } if (min != INF) cout... 阅读全文
posted @ 2013-11-02 23:31 阿牧遥 阅读(153) 评论(0) 推荐(0)
摘要: 老题,两个stack。其中一个维护min值就行了。#include #include using namespace std; int main(){ int n; while (cin >> n) { stack st; stack min; while (n--) { char ch; cin >> ch; if (ch == 's') { int k; cin >> k... 阅读全文
posted @ 2013-11-02 22:54 阿牧遥 阅读(202) 评论(0) 推荐(0)
摘要: 这道题见过,就是把相加的结果作为比较来排序就行了。注意的是comp函数里面要用const引用。而且c++里的字符串直接操作(读入和相加)也很方便。#include #include #include #include #define LEN 105using namespace std; string s[LEN]; bool comp(const string &a, const string &b){ string s1 = a + b; string s2 = b + a; return s1 > m) { for (int i = 0; i > s... 阅读全文
posted @ 2013-11-02 22:22 阿牧遥 阅读(212) 评论(0) 推荐(0)
摘要: 用一个栈辅助,模拟过程+判断就可以了。#include #include #include #define LEN 100005using namespace std;int A[LEN];int B[LEN];int main(){ int n; while (cin >> n) { for (int i = 0; i > A[i]; } for (int i = 0; i > B[i]; } stack st; int i = 0; int j = 0; whi... 阅读全文
posted @ 2013-11-02 22:15 阿牧遥 阅读(223) 评论(0) 推荐(0)
摘要: 找到以后要再扫一遍确认。http://zhedahht.blog.163.com/blog/static/25411174201085114733349/#include #include #define LEN 100005#define ulong unsigned long longusing namespace std;ulong A[LEN];int main(){ int n; while (cin >> n) { for (int i = 0; i > A[i]; } int count = 0; ulon... 阅读全文
posted @ 2013-11-02 20:26 阿牧遥 阅读(229) 评论(0) 推荐(0)
上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 43 下一页