关于查找超过一半的数字的算法问题

本文介绍了一种在数组中查找出现次数超过数组长度一半的数字的算法。通过四种不同的方法,包括排序、哈希统计、顺序统计和消除法,详细探讨了各自的实现原理和代码示例。

排序算法案例

超过一半的数字:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
解法1:排序后返回arr[N/2],NLg(N)
解法2:hash统计
解法3:顺序统计,O(N),限制:需要改动数组的内容
解法4:不同的数,进行消除

代码实现

package LanQiao;

import java.util.Arrays;

public class Demo08
{
	public static void main(String[] args)
	{
		solve5(new int[]{0,1,2,3,1,1});
		//solve4(new int[]{0,1,2,3,1,1});
	}
	static void solve1(int[] arr) {
		    Arrays.sort(arr);
		    System.out.println(arr[arr.length / 2]);
		}
	/*不同的数,进行消除,O(N)*/
	public static void solve4(int[] arr)
	{
		//候选数,先定位第一个元素
		int candidate=arr[0];
	    //出现的次数
		int nTimes=1;
		//扫描数组
		for (int i = 0; i < arr.length; i++)
		{
			//两两消减为0,应该把现在的元素作为候选值
			if (nTimes==0)
			{
				candidate=arr[i];
				nTimes=1;
				continue;
			}
			//遇到和候选值相同的,次数加1
			if (arr[i]==candidate)
				nTimes++;
	        //不同的数,进行消减
			else 
				nTimes--;
		}
		System.out.println(candidate);	  
	}
	  
	//变化,出现次数恰好为个数的一半,求出这个数
	  /*
	  * 关于加强版水王的题我有个想法可以扫描一遍数组就解决问题:
	    水王占总数的一半,说明总数必为偶数;
	    不失一般性,假设隔一个数就是水王的id,两两不同最后一定会消减为0
	    水王可能是最后一个元素,每次扫描的时候,多一个动作,和最后一个元素做比较,单独计数,计数恰好等于一半
	    如果不是,计数不足一半,那么去掉最后一个元素,水王就是留下的那个candidate*/
	  public static void solve5(int[] arr) {
		  int candidate=arr[0];
		  int nTimes=0;
		  int countOfLast=0;//统计最后这个元素出现的次数
		  int N=arr.length;
		  for (int i = 0; i < N; i++)
		{
			//增加和最后一个元素比较的步骤
			  if (arr[i]==arr[N-1])
				countOfLast++;
			  
			  if (nTimes==0)
			{
				candidate=arr[i];
				nTimes=1;
				continue;
			}
			if (arr[i]==candidate)
				nTimes++;

			else 
				nTimes--;		
		}
		  //最后一个元素出现次数是n/2
		  if (countOfLast==N/2)
			System.out.println(arr[N-1]);
		  else 
			System.out.println(candidate);		
	  }	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sparky*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值