来源:编程之美2.3
题目:该"水王"发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?
问题实质:寻找数组中出现的半数以上的数.
思路:如果每次删除两个不同的id,则剩下的水王id依然超过总数的一半,可以不断重复这个过程。
问题扩展:如果有3个id,发贴总数都超过了帖子总数的四个之一,如果快速找到他们。思路都差不多。
/*题目:该"水王"发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,
其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?
问题实质:寻找数组中出现的半数以上的数.
拓展:有3个数,他们的出现次数都超过了总数的1/4.
*/
public class ShuiWang2_3 {
/**
* @param args
*/
public static void main(String[] args) {
int[] id = { 1, 1, 1, 5, 1, 1, 1, 3, 1, 7, 1, 3, 1, 2, 1, 1, 4, 56, 1, 12, 4, 1, 3, 4,
1, 1, 1, 3, 1, 1, 1, 5, 1, 1, 3, 12, 1, 2, 1, 2, 2, 2, 2, 2,2 };
System.out.println(MoreHalfNum(id,id.length));
int id2[] = {5, 5, 5, 7, 7, 8, 8, 8, 8, 2,
2, 2, 2, 2, 2, 2, 2, 5, 5, 5,
6, 5, 6, 7, 7, 7, 7, 7, 7, 7,
7, 5, 7, 2, 2, 2, 5, 5, 5, 8};
printArr(findMore(id2));
}
//每次从数组中删除两个不同的数,不断重复这个过程
//算法中当然不是真的删除数,而是用一个计数器巧妙的实现“删除”
public static int MoreHalfNum(int data[],int n)
{
int candidate=0;//候选值
int nTime=0;//候选值出现的次数
for(int i=0;i