
acm入门
cpf2016
这个作者很懒,什么都没留下…
展开
-
bfs
1.基本思路 1)第一次只有开始遍历的节点入队列 2)判断该节点的邻接点是否被访问过,如果没有访问过则直接打印并入队列,再将该节点设置为已访问 3)直到队列中没有数据则遍历完成 2.实现代码 3.拓展转载 2014-11-12 16:58:46 · 386 阅读 · 0 评论 -
二叉树常见问题
1.统计二叉树中的结点数目 分析:可以使用递归 (1)如果二叉树为空,则有0个结点 (2)如果二叉树不为空,那么结点数=左子树节点数+右子树节点数+1 代码:private static int getNum(BNode root)转载 2014-11-24 21:48:22 · 478 阅读 · 1 评论 -
堆排序
(1)堆的特性 1.根节点的值总是大于任何一个子节点的值(大顶堆) 2.每一个节点的左子树和右子树都是一个堆 注意:对左右子树谁大谁小没有要求 (2转载 2014-12-24 14:49:31 · 380 阅读 · 0 评论 -
位运算实现加法
先用1位数的加法来进行,在不考虑进位的基础上,如下1 + 1 = 01 + 0 = 10 + 1 = 10 + 0 = 0很明显这几个表达式可以用位运算的“^”来代替(异或:相同为0不同为1),如下1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0这样我们就完成了简单的一位数加法,那么要进行二位的加法,这个方法可行不可行呢?转载 2015-01-14 14:22:46 · 388 阅读 · 0 评论 -
二维费用背包
(1)问题描述 每一件物品都有两个费用,选择这个物品需要付出两种代价,对于每种代价都有一个最大值,问怎么选择物品可以获得最大的价值 (2)分析 费用增加了一维,只要状态也增加一维即可。设dp[i][j]表示付出两种代价分别为i和j时可以获得的最大价值,那么状态转移转载 2014-12-08 15:22:54 · 449 阅读 · 0 评论 -
位图使用
(1)排序1.问题描述 给定大量正整数,互不相等,对这些正整数进行排序,要求时间复杂度为O(n)2.分析 一般的排序时间复杂度都达不到O(n),如果数据量比较小,可以使用基数排序。由于此处数据量比较大,所以使用位图。具体而言,假如要对数组 [5, 2, 12, 18, 7, 9, 13, 19, 16, 4, 6] 进行排序(最大值不超过20), 则可以将其映转载 2014-12-26 10:04:39 · 329 阅读 · 0 评论 -
杨氏矩阵
(1)定义 一个m*n矩阵,让一个数组a[k],k 1.每一行每一列都严格单调递增 2.如果填充完后,矩阵中仍有空间,则填入∞转载 2014-12-10 19:28:08 · 394 阅读 · 0 评论 -
BloomFilter
1.引入 假设有一个数据集合,现在需要查找某个数据是否在这个集合中,那么就有一下几个方案: 1)将数据保存到数据库中 2)使用HashSet将数据保存起来,使用contains方法就可以判断该元素是否在集合中 3)使用Bit-Map,建立一个BitSet,将每个数据保存在其中 在数据量较小的时候,以上方法都可以解决问转载 2014-12-26 16:56:49 · 361 阅读 · 0 评论 -
字符串是否包含
(1)题目描述 假设有一个由多个字母组成的字符串A,和另一个字符串B,B中的字符相对少一些,判断是否B中所含的字母是否A中全都包含。 如: String a = "ABCDEFGHLMNOPQRS";转载 2014-12-12 16:40:15 · 386 阅读 · 0 评论 -
KMP
1.简单字符串匹配 (1)问题描述 如给定字符串str1 = "abcaad" ,str2="",判断str1中是否包含str2 (2)思路 使用2个指针i、j,如果i,j指针指向字符相同,那么i++、j转载 2015-01-03 19:12:22 · 318 阅读 · 0 评论 -
快速排序的非递归实现
(1)思路 继续使用adjust进行划分,如果其中的元素不止1个,那么将下标的开始和结束入栈,否则不入栈 (2)代码 private void quickSortNR(int[] a, int begin, int end) { if(begin<end) { Stack stack =转载 2015-01-04 16:28:49 · 306 阅读 · 0 评论 -
O(n)选出第k小元素
(1)思路 类似于快速排序,此处选择第一个元素作为枢轴flag, 调整之后flag左边的都比flag小,右边的都比flag大,此时比较flag的下标index和要查找的k,如果k==index,那么就找到了;如果index>k,说明k在flag的左边区间中;如果index>k,说明k在flag的右边区间中转载 2015-01-04 11:10:03 · 558 阅读 · 0 评论 -
最长回文串
(1)思路 1. 因为字符串长度为奇数和偶数时处理方式不同,所以这里可以使用插入特殊字符的方法,使得每个字符串在处理之后长度都为奇数。处理方法为:在任意两个字符之间和字符串的开始和结尾插入'#'。(因为设字符为n个,那么共有n-1个间隙,n+(n-1)必然为奇数,再加上首尾'#'还是奇数)。因为要防止越界,所以在修改后的字符串首尾再加上边界,开始为转载 2015-01-04 14:29:42 · 478 阅读 · 0 评论 -
完全背包
(1)未压缩空间 1.问题描述 有N种物品和一个容量为V的背包,每种物品都有无限件可以使用,第i件物品的重量为weight[i],价值为value[i]。求解将哪些物品放入背包可使总价值最大。 2.特点转载 2014-12-04 15:17:00 · 350 阅读 · 0 评论 -
数组相关问题
1.通过一行代码实现转载 2014-11-19 12:38:28 · 440 阅读 · 0 评论 -
基数排序
基数排序编程论到极致,核心非代码,即思想。所以,真正的编程高手同时是思想独到及富有智慧(注意与聪明区别)的人。每一个算法都是一种智慧的凝聚或萃取,值得我们学习从而提高自己,开拓思路,更重要的是转换思维角度。其实,我们大多数人都活在“默认状态”下。没有发觉自己的独特可设置选项-----思想。言归正传(呵呵!恢复默认状态),以下学习基数排序。【1】基数排序以转载 2014-12-05 19:54:21 · 380 阅读 · 0 评论 -
二分查找
1.思路对于已经转载 2014-11-18 16:27:12 · 299 阅读 · 0 评论 -
排序
(1)冒泡排序1.思路转载 2014-11-19 16:09:41 · 464 阅读 · 0 评论 -
最长公共子串(LCS)(连续与非连续)
1.使用一个二维数组count[i][j]来表示转载 2014-11-14 15:29:45 · 838 阅读 · 0 评论 -
DFS
1.wei转载 2014-11-20 15:53:17 · 396 阅读 · 0 评论 -
图的最短路径
1.过程(1)转载 2014-11-18 15:52:26 · 424 阅读 · 0 评论 -
归并排序
(1)背景——合并2个有序数组 合并两个有序数组非常简单,只要依次比较两个数组中的数据,较小的放入结果数组中并指针后移,直至移至某一个数组的结尾,再将另一个数组所有数据放入结果数组即可 private static void merge(int[] a, int[] b, int[] c) { int i=0; int j=0; i转载 2014-11-27 14:00:17 · 341 阅读 · 0 评论 -
链表相关问题
1.转载 2014-11-22 21:02:28 · 408 阅读 · 0 评论 -
trie树
(1)概述 trie树,又称字典树或前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是26叉树,数字的字典树是10叉树。 (2)构建 如果我们有and,as,at,cn,com这些关键词,如何构建trie树呢?转载 2014-12-23 09:24:09 · 317 阅读 · 0 评论 -
海量数据处理
(1)通用解法 1)将所有数据通过哈希函数 pos = key % M,写入M个文件中。(这里的M可以根据内存情况调整) 2)通过HashMap等结构记录每个文件中的情况,再将所有的HashMap结果合并即可 (2)数字型转载 2015-01-08 12:49:39 · 349 阅读 · 0 评论 -
LIS及扩展
(1)LIS 1.题目描述 一个整数数组,求其中最长递增子序列 2.分析转载 2014-12-04 19:16:00 · 297 阅读 · 0 评论 -
回溯法
(1)搜索子集树 1.适用问题:求子集、0-1背包问题(实际上就是求组合的问题) 2.子集树 其中1表示选择,0表示不选。每一层各个节点其实表示的是集合中同一个元素的选择情况,如{1,3,5},A表示元素1选择或转载 2015-08-18 17:56:28 · 371 阅读 · 0 评论