• 剑指offer:数组中出现次数超过一半的数


    题目描述:

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

    解题思路:

    这道题应该是之前本科是上算法课做过的题目。两种思路。

    思路一:

    对数组进行排序,那么中间位置的数就是出现次数超过一半的数。这种做法的时间复杂度为O(nlogn)。

    思路二:

    题目中要找的数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。

    因此我们可以考虑在遍历数组的时候保存两个值:一个是数组中的一个数字flag,一个是次数count。

    当我们遍历到下一个数字的时候,

    如果下一个数字和当前我们保存的数字相同,则次数加 1;

    如果和当前我们保存的数字不同,则次数减 1;

    当次数减到 0 的时候,我们将保存的数字改为当前遍历所处的位置,并将次数更改为 1。

    注意,在扫描结束后,需要再次确认一次,将数组中的数字与flag做一次比较,超过数组半数以上,则输出flag,否则输出0。

    代码:

    class Solution {
    public:
        int MoreThanHalfNum_Solution(vector<int> numbers) {
            if(numbers.size()==0)
                return 0;
    
            int count=1;
            int flag = numbers[0];
            for(int i=1; i<numbers.size(); i++)
            {
                if(flag != numbers[i])
                {
                    count--;
                    if(count<=0)
                    {
                        flag = numbers[i];
                        count = 1;
                    }
                }
                else
                    count++;
            }
            int counts = 0;
            for(int i = 0; i<numbers.size(); i++)
            {
                if(flag == numbers[i])
                    counts++;
            }
            if(counts>(numbers.size()/2))
                return flag;
            else
                return 0;
        }
    };
  • 相关阅读:
    HDU 1452
    POJ 1845
    POJ 2992
    POJ 3358
    POJ 3696
    POJ 3090
    POJ 2478
    2016大连网络赛 Football Games
    2016大连网络赛 Function
    2016大连网络赛 Sparse Graph
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10598214.html
Copyright © 2020-2023  润新知