摘要: 这个题目是非常经典的一个题目,解法也有很多,现在就把我已经理解的解法记录下来。 题目描述   有n个无序的数,它们各不相等,怎样选出其中的最大的k个数呢? 题目分析: 解法1:   最容易想到的就是把n个数进行排序,然后选择最大的k个数。排序算法很多,快速排序和堆排序都是不错的选择,他们的复杂度都是Ο(n*log2n),然后取出前k个Ο(k),总的时间复杂度可以看成是Ο(n*log2n)   在这个解法中,对n个数进行了排序,如果n的数值非常大的话,会很慢。 解法2:   能不能只遍历一边n个数就能把最大的k个数选出来呢?答案是可以的。   在解法2中,规定,n个数存储在数组array[n]中,我们需要开辟k个数的空间result[k]。遍历的最终目的是把最大的k个数存储在result[k]中。每一步的过程是,当遍历到array[i]时,判断array[i]是否比result[]中最小的数大,如果是,则表明,array[i]应该出现在result[]中(此时假设result[]中已存满k个数)。   那么应该用什么样的方式来进 阅读全文
posted @ 2013-09-18 14:06 viczzx 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 我们学一个算法,一定是为了用吧,所谓“学以致用”吗?那么判断两个链表是否相交有什么用呢?这是因为一旦两个链表出现相交的情况,就可能发生这样的情况,程序释放了链表La的所有节点,这样就导致了另外一个与之有相交节点的链表Lb中的节点也释放了,而Lb的使用者,可能并不知道事实的真相,这会带来很大的麻烦。 1.问题分析   看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环)   (1)一旦两个链表相交,那么两个链表中的节点一定有相同地址。   (2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点。   分析出来了问题的本质,那么思路也就自然有了。 2.问题解法 2.1 哈希解法:   既然连个链表一旦相交,相交节点一定有相同的内存地址,而不同的节点内存地址一定是不同的,那么不妨利用内存地址建立哈希表,如此通过判断两个链表中是否存在内存地址相同的节点判断两个链表是否相交。具体做法是:遍历第一个链表,并利用地址建立哈希表,遍历第二个链表,看看地址哈希值是否和第一个表中的节点地址值有相同即可判断两个链表是否 阅读全文
posted @ 2013-09-18 09:28 viczzx 阅读(95) 评论(0) 推荐(0) 编辑