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

本文介绍了一种通过快速排序方法在数组中查找出现次数超过数组长度一半的数字的技巧,避免使用哈希表,提供了一种更有趣且富有挑战性的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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;
    }
};





                
### 找到组中出现次数超过一半 对于这个问题,有多种方法来解决。一种直观的方法是利用计器的思想[^1]。 这种方法通过创建一个额外的计组或者哈希表来记录每个元素出现的频率。当遍历原组`arr`时,每当遇到一个新的值就会更新对应的计位置。完成整个组的扫描后,再对计结构做一次线性查找即可定位目标值。然而这种方案的空间开销较大,在某些情况下可能不是最优的选择[^4]。 更高效的解决方案之一被称为Boyer-Moore 投票算法。此算法基于这样一个事实:如果某元素的量确实超过了组长度的一半,那么即使每次都将它与其他不同元素配对抵消掉一对儿,最终剩下的那个未被完全抵消的就是我们要找的目标元素。具体操作如下: - 初始化候选者变量 `candidate` 和计器 `count`。 - 遍历组中的每一个元素: - 如果当前元素等于候选人,则增加计; - 否则减少计直到变为零为止,并更换新的候选人。 最后一步是为了验证所选出来的候选人确实是符合条件的那个唯一解。因为题目已经保证了解的存在性和唯一性,所以这步实际上是对上述逻辑的一个形式上的确认而已[^3]。 下面是Python版本的具体实现代码: ```python def majorityElement(nums): candidate = None count = 0 for num in nums: if count == 0: candidate = num if num == candidate: count += 1 else: count -= 1 return candidate ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值