找出一组数出现次数超过一半的数

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">问题是这样的,有一组数,里面有各种数据,现在需要找出来一个数,它的出现的频率超过了一半。</span>


题目很简单,最直接的想法就是把数组排序,这样最中间的数肯定就是需要找的数。原理是这个数占了数组的一半,而且这个数所有的长度是超过了数组的一半大小,所以这个数无论从什么位置开始,都是要经过中间位置的数的。


代码如下:


import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int total = scanner.nextInt() * scanner.nextInt();
            int[] input = new int[total];
            for (int i = 0; i < total; i++) {
                input[i] = scanner.nextInt();
            }
            Arrays.sort(input);
            System.out.println(input[total / 2]);
        }
    }
}


但是这样排序的话效率是很低的,有没有比较简单的方法呢,答案是有的,因为这个数的出现次数是大于一半的,所以我每次同时删除这个数和一个不同于这个数的话,那么最终剩余的数肯定就是这个数了,因为它出现的次数大于一半。思路也很简单,代码如下:

import java.util.Scanner;

public class BigColor {
	public static void main(String args[])
	{
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		
		int index = 0;
		int count = 0;
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				int x = sc.nextInt();
				if(count==0)
				{
					index = x;
					count++;
				}
				else
				{
					if(x==index)
						count++;
					else 
						count--;
				}
			}
		}
		System.out.println(index);
	}

}

这样就找出了出现次数大于一半的那个数。


把这个问题隐身下:有三个数出现次数都是超出1/4的,问如何找出这三个数,思路是一样的,找出这三个数的话,就是每次都同样删除这三个数和一个不同于这三个数的数,最后剩余的数中有三个不同的数肯定就是所需要找到的三个数了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值