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

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值