码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-17 10:33:19      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:



《剑指OfferP163

题目:找出数组中一个出现次数超过整个数组长度一般的数字

 

解法一:将原问题转化为求数组的中位数,采用快速排序的思想,每一次Partition取末位为哨兵,遍历将小于、大于哨兵的数分别移至哨兵左右,最后返回哨兵在处理后的数组中的位置。不断缩小要处理的数组的长度大小,最终确定返回值为数组长度一半的元素,即为中位数。

 

解法二:由于题设该数字出现的次数大于其他所有数字出现的次数,故用两个变量,一个表示数字num_data,一个表示次数;当下一个数字等于num_data时,则times1;如若不等于,time1;直至times等于0,则将num_data更换为下一个数字;由题知,最后得到的num_data的结果必为所要求得的值。

public class MoreThanHalfNum {

	/*****************实现方法一**********************/
	//解法一:基于Partition方法
	public int MoreThanHalfNum1(int[] data)
	{
		if((data == null) || data.length == 0)
		{
			return 0;
		}
		//先进行一次Partition
		int target = data.length >> 1;//目标index
		int start = 0;
		int end = data.length - 1;//设定默认初始值
		int index = Parttition(data, start, end);
		
		while(index != target)
		{
			if(index < target)//表示中位数在data[index]后半部分
			{
				start = index  + 1;
			}
			else   //表示中位数在data[index]前半部分 
			{
				end = index - 1; 
			}
			index = Parttition(data, start, end);
		}
		//判断找到的数在原数组是否确实有>n/2个
		return Judge(data, data[index]);
	}
	
	//判断找到的数在原数组是否确实有>n/2个
	private int Judge(int[] data, int target_num)
	{
		int times = 0;
		for(int num : data)
		{
			if(num == target_num)
			{
				times++;
			}
		}
		return times*2 > data.length ? target_num : 0;
	}
	
	//快速排序的核心方法
	private int Parttition(int[] data,int start,int end)
	{
		//选取哨兵
		int mid_num = data[end];
		int index = start;//位置记录
		
		for(int i = start; i < end; i++)
		{
			if(data[i] > mid_num)
			{
				swap(data, i, index);
			}
			else 
			{
				index++ ;
			}
		}
		swap(data, index, end); 
		return index;
	}
	
	//无法像C++一样使用引用实现,故只好使用data数组进行改变
	private void swap(int[] data , int a, int b)
	{
		int temp = data[a];
		data[a] = data[b];
		data[b] = temp;
	}
	
	/*****************实现方法二******************/
	public int MoreThanHalfNum2(int[] data)
	{
		if((data == null) || data.length == 0)
		{
			return 0;
		}
		int num = data[0];//记录数据
		int times = 1;//记录次数
		
		for(int data_num : data)
		{
			if(0 == times)
			{
				num = data_num;
				times ++;
			}
			else if(num == data_num)
			{
				times++;
			}
			else
			{
				times--;
			}
		}
		return Judge(data, num);
	}
	
	public static void main(String[] args) {
		int[] data = {1,2,3,2,2,2,5,4,2};
		MoreThanHalfNum moreThanHalfNum = new MoreThanHalfNum();
		System.out.println(moreThanHalfNum.MoreThanHalfNum2(data));
	}

}


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

标签:

原文地址:http://blog.csdn.net/woliuyunyicai/article/details/44337233

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!