数组中出现次数超过数组长度一半的值

原创 2015年07月09日 15:38:37

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为18的数组{1,0,2,6,1,0,1,1,5,2,1,1,1,3,1,1,5,1}, 由于数组中数字1出现的次数超过数组的长度的一半,因此输出1。

1)最直接的办法是先把数组排序,那么超过一半的元素一定是数组最中间的元素。

2)再深入思考一下就会想到快速排序过程,利用partion找出index==middle时,index对应的值,而不必完全排序。

3)第二种办法比较抽象,设一个变量保存当前值,设一个次数,当前值与下一个值进行比较,如果相等,次数加一,如果不相等,次数减一,如果次数减到0了还是不相等,就把当前值替换掉。

       这里只展示了2)、3)的源码,没有数据合理性校验。

#include<iostream>
#include<vector>

using namespace std;

int partion(vector<int>& vec,int low,int high)
{//快速排序的基础
	int key = vec[high];
	int fast = low;
	int slow = low;
	while (fast < high)
	{
		if (vec[fast] <= key)
		{
			if (fast == slow)
				slow++;
		}
		else
		{
			if (fast != slow)
			{
				int tmp = vec[slow];
				vec[slow] = vec[fast];
				vec[fast] = tmp;
				slow++;
			}			
		}
		fast++;
	}
	int tmp = vec[slow];
	vec[slow] = vec[high];
	vec[high] = tmp;
	return slow;
}

int find_half1(vector<int> vec)
{
	int length=vec.size();
	if (length == 0)
		return 0;	
	int start = 0;
	int end = length - 1;
	int middle = length >> 1;
	int index = partion(vec, start, end);
	while (index != middle)
	{//中位值肯定是出现次数超过一半的数
		if (index > middle)
		{
			end = index - 1;
			index = partion(vec, start, end);
		}
		else
		{
			start = index + 1;
			index = partion(vec, start, end);
		}
	}
	cout << "index:" << index << endl;
	return vec[index];

}


int find_half2(vector<int> vec)
{//设置key和index,如果出现等于key的值,index++,否则index--;
	//如果index==0,则更新key的值,因为目标值出现次数超过一半,所以,index必然大于0
	int key=vec[0];
	int index = 0;
	for (int i = 0; i < vec.size(); ++i)
	{
		if (vec[i] == key)
		{
			index++;
		}
		else
		{
			if (index == 0)
			{
				key = vec[i];
				index++;
			}
			else
			{
				index--;
			}
		}
	}
	return key;
}

int main()
{
	int a[18] = {1,0,2,6,1,0,1,1,5,2,1,1,1,3,1,1,5,1};
	vector<int> vec(a, a + 18);//这种容器初始化方式很有用
	for (int i = 0; i < vec.size(); ++i)
	{
		cout << vec[i] << "   ";
	}
	cout << endl << find_half1(vec) << endl;
	return 0;
}




相关文章推荐

找出数组中出现的次数超过数组长度的一半

问题说明: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出...

找出数组中出现次数超过数组长度一半的元素

数组中出现次数超过一半的数字 来自剑指offer,其中两种方法思想都很好,感谢作者。 #include using namespace std; /* 两种思想:第一种想到统计上的中位...
  • huruzun
  • huruzun
  • 2014年03月30日 11:34
  • 3275

找出数组中出现次数超过数组长度一半的数字

分析:从数组中取出两个数pk,如果不相同,两个数都去掉,如果相同,再找下一个数pk,最后剩下的数就是目标数,程序如下: #include #include bool FindNumberOv...

Java实现 找出数组中出现次数超过数组长度一半的元素

简述 : 给定一个数组,找出数组中元素出现次数超过数组长度一半的元素 如数组: [4, 3, 2, 1, 1, 1, 1, 1, 1, 0 ] 其中超过一半的元素就是 1 两种实...
  • anialy
  • anialy
  • 2012年10月16日 01:34
  • 3652

php算法:找出数组中出现次数超过数组长度一半的数字

关于水王的题目——找到出现次数大于/等于数组长度一半的数

关于水王的题目——找到出现次数大于/等于数组长度一半的数 1. 题目描述 一个长度为n的数组,里面有一些数出现的次数比较多。请找到出现次数大于数组长度一半的数。(水王1) ...

求数组中出现次数大于数组长度一半元素

最近听参加今年研究生考试的同学说了这样一道算法题:已知一个整数数组,让你判断其中是否存在出现次数大于数组长度一半的元素,如果存在的话输出其中第一次出现该元素时数组的下标;如果不存在的话,输出-1。 ...

数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

这个方法借用了别人的思路。      在这里我做一下简单的分析。      这个算法的时间复杂度是O(n),另外用了两个辅助变量。      k用于临时存储数组中的数据,j用于存储某个数出现的次...

面试:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

/*********************************************************************** 有个数字出现的次数超过了数组长度的一半,也就是, 有个...

线性时间查找数量超过数组长度一半的数

期望线性时间查找数量超过数组长度一半的数思路分析事实上,数量超过数组长度(n)一半的数也就是数组中第n/2大的数。 这道题如果不限制时间复杂度,brute force(通过排序)查找的时间复杂度可达...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组中出现次数超过数组长度一半的值
举报原因:
原因补充:

(最多只允许输入30个字)