剑指Offer - 判断数组中是否有一个数出现次数多于一半

Posted charlesblc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer - 判断数组中是否有一个数出现次数多于一半相关的知识,希望对你有一定的参考价值。

https://www.nowcoder.net/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

 

题目描述

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

思路:

勉强做出来了,但是最后一步还是参考了别人的。就是关于怎么检验这个数字出现的次数的确是超过了一半,而不是没有解的结果,我没有什么思路。看了别人的。
别人有好几种解法,我觉得partition的思路还是很不错的。
那么我自己,其实用的是消去法。能解出结果,不过最后是需要再O(n)检查一下这个结果的确合法。
 

我的代码如下:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> xx) {
        vector<int> numbers = xx;
        int n = numbers.size();
        while (n > 1) {
            int y = 0;
            for (int x = 0; x < n/2; ++x) {
                if (numbers[2*x] == numbers[2*x+1]) {
                    numbers[y++] = numbers[2*x];
                }
            }
            if (n == n/2*2+1) {
                numbers[y++] = numbers[n-1];
            }
            n = y;
        }
        int cnt = 0;
        for (int i=0; i<xx.size(); ++i) {
            if (xx[i] == numbers[0]) cnt++;
        }
        
        if (cnt > xx.size() / 2) return numbers[0];
        else return 0;
        
    }
};

 

 
 
 
 

以上是关于剑指Offer - 判断数组中是否有一个数出现次数多于一半的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer[28]——数组中出现次数超过一半的数字

剑指offer---数组中出现次数超过一半的数字

数组中出现次数超过一半的数字-剑指Offer

剑指offer:数字在排序数组中出现的次数

剑指offer39-数组中出现次数超过一半的数字

剑指offer39-数组中出现次数超过一半的数字