找出出现次数站数据总数一半以上的数据

假设数组类型为整形数组编程

  • 首先想到的思路是对每一个出现过的数据进行个数统计,借助一个键值对集合,存放不一样的数据及对应的出现的次数。出现次数大于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

相关文章
相关标签/搜索