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

######  注意是超过,不是大于等于。

此时:如果用快速排序,时间复杂度就是O(nlogn)。

这个时候,大部分人的思想基本会陷入排序的漩涡中,认为必须要排序,才可以得到这个数字,

,,,,,,

然后就会出现坚持不住了,果断放弃,这个时候你肯定会错失了你的offer。

,,,,,,

当你分析透题目重点“超过一半”的时候,找出它的基层特点,就会得出好的解决办法,

剑指offer中解析:

当超过一半的时候,说明它出现的次数比其他所有数字出现次数的和还要多。因此我们可以考虑在遍历数组的时候保存两个值:

一个是数组中的一个数字,一个是次数。当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1。

如果下一个数字和我们保存的数字不同,则次数减1。如果次数等于0,我们需要保存下一个数字,并把次数设为1。

由于我们要找的数字出现的次数比其他所有数字出现的次数之和还要多,那么我们要找的数字肯定是最后一次次数不为0时,对应的数字。

代码实现如下:

import java.util.Scanner;

public class Main
{
    static int MAX = 105;
    static int num[] = new int[MAX];
    public static void main (String[] args)
    {
        Scanner cin = new Scanner(System.in);
        int N = cin.nextInt();
        for (int i = 0; i < N; i++)
        {
            num[i] = cin.nextInt();
        }
        int p = num[0];
        int cntp = 1;
        for (int i = 1; i < N; i++)
        {
            if (cntp == 0)
            {
                p = num[i];
                cntp = 1;
            }
            else if (num[i] == p)
            {
                cntp++;
            }
            else
            {
                cntp--;
            }
        }
        System.out.println(p);
    }
}

这个方法的时间复杂度明显是O(n),明显比快速排序快。


最后说明一点:本博主,一切代码都用java书写,因为要用java去参加蓝桥杯。如果遇到阅读困难的,请call博客哈,谢谢观看

原文地址:https://www.cnblogs.com/674001396long/p/9817270.html