编程之美-2.3-寻找发帖“水王”
1. 简述
原题:简略的说,就是一个ID列表,其中每个ID都可能重复出现,其中一个ID的重复出现个数超过了列表长度的一半。要求快速找到这个ID。
扩展:ID列表中,有三个ID,这三个ID重复出现的次数,都超过了列表长度的1/4。要求快速找到这个ID。
2. 思路
原题的思路还是编程之美上面的方法,扩展题目的方法是参考中的一篇文章中讲过。
原题的思路是保存一个ID和该ID的计数,然后遍历ID列表,如果当前没有保存的ID(即ID对应次数为0),那么保存遇到的ID,并且计数设置为1;如果遇到的ID刚好是保存的ID,那么计数加1;如果遇到的ID是一个新的ID,那么ID的计数减1。这样遍历之后,保存的ID必然就是所求ID。因为所求的ID占ID列表长度一半以上,并且只有不同的两个ID才会消减,所以,无论消减顺序如何,最后超过一半以上的ID一定是不会被消减掉的,也是唯一一个不会被消减掉的。
扩展题目的思路是,保存三个ID和对应三个计数,然后遍历ID列表,如果当前有没有保存的ID(即有ID对应次数为0),那么保存这个ID,并且将对应的计数设置为1;如果遇到的ID是一个已经保存的ID,那么将对应ID的计数加1;如果遇到的ID是一个新的ID,而且此时已经保存了三个ID了,那么这三个ID的计数分别减1。由于N次遍历,最多消减N/4个ID,而要求的三个ID次数都大于N/4,因此这三个ID肯定不会被消掉,而最后只保存了三个ID,要求的三个ID又不会被消掉,那么必然说明保存的三个ID就是要求的这三个ID。
基本上很容易扩展到K个ID,其中每个ID出现的次数都超过N/(K+1)次的情况,其中,N为ID列表长度。
3. 代码
这个略了吧。
4. 参考
编程之美-2.3-寻找发帖“水王”
寻找发帖“水王”--《编程之美》笔记