zoukankan      html  css  js  c++  java
  • 剑指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-2262 Where is the canteen 概率DP,高斯消元
    HDU-4418 Time travel 概率DP,高斯消元
    无人驾驶相关数据集
    C++——编译器运行过程
    C++——Struct 和 Union区别
    常用linux指令
    无人驾驶——定位
    Ubuntu 没有 无线网 RTL8821ce 8111 8186
    无人驾驶之传感器融合算法
    LIN通讯
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10598214.html
Copyright © 2011-2022 走看看