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;
        }
    };
  • 相关阅读:
    3747 [POI2015]Kinoman
    1303 [CQOI2009]中位数图
    3769 [spoj 8549] BST again
    1015 [JSOI2008]星球大战starwar
    1193 [HNOI2006]马步距离
    合并Git仓库不相关历史版本解决方案
    vue-cli项目实现动态锚点定位
    jQuery加css3实现菜单栏组件(可无限添加子列表)
    JavaScript文件转成base64编码
    Ajax获取服务器响应头部信息
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10598214.html
Copyright © 2011-2022 走看看