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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daaikuaichuan/article/details/85238320

题目描述:

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

解题思路一:

  使用map记录下每个数字及其出现的次数,判断次数如果超过一半了,则直接输出。

Demo1:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int num = 0, sz = numbers.size();
        map<int,int> mp;
        for (auto &n : numbers)
        {
            mp[n]++;
            if (mp[n] > sz/2)
            {
                num = n;
                break;
            }
        }
        return num;
    }
};

解题思路二:

  根据数组的特点,有一个数字出现超过一半的话,就意味着它出现的次数比其他任何数出现的次数之和还多。

1. 在遍历数组时保存两个值:一是数组中一个数字,一是次数

2. 遍历下一个数字时,若它与之前保存的数字相同,遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。

3. 遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。

在这里插入图片描述

扫描二维码关注公众号,回复: 4739679 查看本文章

Demo2:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int result = numbers[0];
        int times = 1, sz = numbers.size();
        for (int i = 1; i < sz; ++i)
        {
            if (times == 0)
            {
                times = 1;
                result = numbers[i];
            }
            else if (numbers[i] == result)
                times++;
            else
                times--;
        }
        // 判断result是否符合条件,即出现次数大于数组长度的一半
        times = 0;
        for(int i = 0; i < sz; ++i)
        {
            if(numbers[i] == result) ++times;
        }
        return (times > numbers.size() / 2) ? result : 0;
    }
};

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/85238320