备战春招/考研复试--剑指offer--数组中出现次数超过一半的数字

题目描述如下:

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

个人思路:

       此题目曾经是考研计算机统考命题408中出现过的题目,解析中给出了如下方案:

       如果一个数字能够在一个数组中出现的次数大于数组长度的一半,那么它一定会连续出现至少一次。我们可以从这个思路下手。

       {1,2,3,2,2,2,5,4,2}就拿这个例子来说明。我们称所要找的元素为主元素并记录为num,将其连续计数设为count。

       首先从头开始遍历,如果与记录的主元素一致,则连续计数加一,否则减一,若连续计数变为0,则改变当前主元素为当前所便利的元素。

遍历到1,num=1,count=1;

遍历到2,num=2,count=1;

遍历到3,num=3,count=1;

遍历到2,num=2,count=1;

遍历到2,num=2,count=2;

遍历到2,num=2;count=3;

遍历到5,num=2,count=2;

遍历到4,num=2,count=1;

遍历到2,num=2,count=2;

最后,需要再整体遍历一次数组,以便检查我们所记录的主元素是否出现了大于length/2次。

代码:

int MoreThanHalfNum_Solution(vector<int> numbers) {
        int num = 0;   //记录当前读取到的数字
        int count = 0; //记录连续出现的次数
        for(int i = 0; i < numbers.size(); ++i){
            if(numbers[i] == num) //num 连续出现
                ++count;
            else  //没有连续出现,连续计数减一
                --count;
            if(count <= 0){
                num = numbers[i];
                count = 1;
            }
        }
        int sum = 0;
        for(int i = 0; i < numbers.size(); ++i){//检查是否为主元素
            if(numbers[i] == num)
                sum++;
        }
        return sum>(numbers.size()/2)? num:0;
    }


 

发布了9 篇原创文章 · 获赞 0 · 访问量 1325

猜你喜欢

转载自blog.csdn.net/qq_41645895/article/details/103726453