それより数字の半分以上を見つけることについてアルゴリズムの問題

ソートアルゴリズムケース

数字の半分以上:デジタル配列は、この番号を見つけるために、より多くの配列の長さの半分より登場した回数。
溶液1:リターンNLG、ARR [N / 2]をソート (N)
溶液2統計ハッシュ:
溶液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元の記事 ウォンの賞賛3 ビュー104

おすすめ

転載: blog.csdn.net/weixin_43362002/article/details/103987316