假设数组类型为整形数组编程
首先想到的思路是对每一个出现过的数据进行个数统计,借助一个键值对集合,存放不一样的数据及对应的出现的次数。出现次数大于N/2的即为要获得的结果。当数据量大的时候,会消耗空间。数组
第二种思路是对已有的数据进行排序,排序以后相同的数据时连续的,又由于目标数据的出现次数大于N/2,因此下标在N/2的数据必定要找的数据。时间复杂度为O(N*logN)code
前两种思路要么要借助其余空间,要么时间复杂度高。下面介绍第三种思路。排序
若是咱们每次删除两个不一样的数据,那么该数在剩余的数据中仍然占大于N/2的比例,经过不断的删除,把大的问题简化成小的问题,就能够简便的求解。get
int calculate(int a[],int n) { //target为要找的数据 int target=0; int times=0; for(int i = 0;i<n;i++) { //若是times为0,标志着前面的数据已删除,从剩下的数据中开始查找 if(times==0) { //将当前位置的数据假设为target target=a[i]; times=1; } else { if(target==a[i]) { times++; } else { times--; } } } return target; }
参考书籍:《编程之美》class