查找出现次数出现了一半的数

来源:互联网 发布:青岛知行国际怎么样 编辑:程序博客网 时间:2024/04/26 18:08

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

题目是这样子的,= =,当然,能够想到的办法可以用hash表来统计下每个元素出现的个数,然后判断是不是有超过了总数一半的数字就可以得出答案了。

然而。。。
作为一个比较折腾的博主,非要用找中位数的方法来求得答案。
思路是按照快速排序的函数,找到”中位数“,然后遍历数组,判断这个数的出现次数是不是超过了一半,是不是很作死啊 = =
code 如下:
class Solution {public:int Partion(vector<int >& vec , int begin , int end ){        if(vec.size() == 0 || begin < 0 || end < 0 ){            return -1;        }        int tmp = vec[ begin  ];        while(begin < end  && begin >=0){            while ( begin < end && vec[end ] >= tmp ){ //记得是大于等于符号哦                end--;            }            if(begin < end )            {                vec[begin ] = vec[end];                begin++;//要记得加上额            }            while(begin < end && vec[begin ] < tmp){                begin ++;            }            if(begin < end )            {                vec[end ] = vec[begin ];                end--;//要记得减去            }        }        vec[begin ] = tmp;        return begin ;    }    int MoreThanHalfNum_Solution(vector<int> numbers) {    if(numbers.size() == 0) return 0;        size_t mid = numbers.size()/2;        int begin = 0;        int end = numbers.size() - 1;        size_t index = Partion(numbers, begin , end );        while(index != mid){            if( index   >  mid ){                index = Partion( numbers , begin , index -1);            }            else {                index = Partion( numbers , index + 1 , end );            }        }        int mid_num = numbers[index];        size_t times = 0;         for(size_t index =0 ; index <numbers.size() ; index++ ){            if(numbers[index] == mid_num){                                times++;            }                   }        if(times*2 > numbers.size()) return mid_num;        else return 0;    }};



                                             
0 0
原创粉丝点击