摘要:方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn);方法2:维护一个容量为K的最大堆(《算法导论》第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如果大于最大元素则忽略,如果小于最大元素则将次元素送入堆中,并将堆的最大元素删除,调整堆的结构;方法3:使用快速排序...
阅读全文
摘要:《算法》中二叉查找树一节的习题:按层遍历二叉查找树。可以使用队列来管理二叉查找树中的节点,节点按照如下方法入队出队:节点x入队当队列不为空时使用队列的第一个元素first如果节点first.left不为空则将fisrt.left入队如果节点first.right不为空则将first.right入队将...
阅读全文
摘要:如题:求一个数组的子数组的最大和,要求O(n)时间复杂度。由于有了O(n)时间复杂度的限制,所以暴力求解的O(n^2)方法肯定不行。再考虑递归求一个数组a[n]的子数组的最大和,可以分解为a[i]子数组的最大和以及a[n-i-1]之间的某种情况a[n]的子数组最大和等于a[i]子数组的最大和;a[n...
阅读全文
摘要:之前在学习二叉查找树时按照递归方式实现了二叉查找树:http://www.cnblogs.com/elvalad/p/4129650.html在实际应用中由于递归的深度和性能等问题会要求使用非递归方式实现二叉查找树的search操作,这里用循环的方式实现put,get,min和max操作。二叉查找树...
阅读全文
摘要:《算法》中的二叉查找树一节的一道习题。N个元素组成的二叉树固定一个根节点,这个根节点的左右子树组合数为(0,n-1),(1,n-2),(2,n-3)...(n-1,0),假设N个元素组成的二叉树种类为f[n],则f[n] = f[0]*f[n-1]+f[1]*f[n-2]+...+f[i]*f[n-...
阅读全文
摘要:实现桟的push和pop操作,以及桟的min操作返回桟中的最小值,要求这三个操作的时间复杂度均为O(1)。在Java中可以使用LinkedList实现桟的各种操作,这里使用双向链表实现桟的push和pop操作,这两个操作都能维持O(1)的时间复杂度,但是对于求桟中元素的最小值,最容易想到的方法是遍历...
阅读全文
摘要:如题将二叉查找树转换为排序的双向链表,要求输入一棵二叉查找树,输出为一个排好序的双向链表,要求不能创建新的节点,只能改变指针的指向。这个问题的考察点涉及到二叉查找树的概念,以及如何建立二叉查找树,双向链表的概念,以及二叉查找树和排序的双向链表的转换。二叉查找树又称为有序二叉树,是指一颗空树或者具有以...
阅读全文
摘要:1.基本概念一颗二叉查找树是一颗二叉树,其中每个节点都含有一个Comparable的键以及和键相关联的值,且每个节点的键都大于其左子树中任意节点的键而小于右子树的任意节点的键。使用链表构成的符号表在插入操作上具有灵活性,而数组构成的符号表在搜索查找上具有更高的效率,二叉查找树可以将二者的优势结合。一...
阅读全文
摘要:《编程之美》第二个问题,将帅位置的组合,要求只能使用一个变量。问题本身很简单,但是加上要求限制之后(只能使用一个变量)就需要深入思考这个变量该存储什么内容了,仔细思考,将A的位置为9选1有9种可能,帅B的位置也为9选1有9种可能,二者组合共有81种可能,所以用一个能存够81个不同元素的byte类型即...
阅读全文
摘要:计算机领域最基础的操作:排序 http://en.wikipedia.org/wiki/Sorting_algorithm。冒泡排序:http://en.wikipedia.org/wiki/Bubble_sort选择排序:http://en.wikipedia.org/wiki/Selection...
阅读全文
摘要:1.背景《算法》一书中提到了关于算法的一些基本思想优秀的算法因为能够解决实际的问题而变得更为重要; 高效算法的代码可以很简单; 理解某个实现的性能特点是一项有趣而令人满足的挑战; 在解决同一个问题的多种算法之间进行选择时,科学方法是一项重要工具; 迭代式改进能够让算法效率越来越高; 使用union-...
阅读全文
摘要:在一个不重复的数组中,统计有多少组两个元素相加得0。这里使用三种方式实现,并统计他们各自花费的时间:import java.util.Arrays;import java.util.HashMap;import java.util.Random;public class TwoSum { priva...
阅读全文
摘要:1. 背景知识对于算术表达式(1+((2+3)*(4+5))),如何使用程序进行计算能够很好表示运算符的优先级,从而获得正确的结果呢?简化处理,我们将算术表达式当做一个字符串,包含运算数,左括号,运算符和右括号,这里只处理带有加减乘除以及求平方根的运算。E.W.Dijkstra发明了一种简单的算法,...
阅读全文