摩尔投票法

摩尔投票法

摩尔投票法用于求取数组中出现超过一半的数字。

空间复杂度: O(1)

时间复杂度: O(n)

摩尔投票算法的基本思想很简单,它通过消除不同元素之间的对抗来找到可能的多数元素。算法遍历数组并维护两个变量:候选元素(candidate)和其对应的票数(count)。开始时,候选元素为空,票数为0。然后对于数组中的每个元素(current_num),执行以下步骤

  1. 如果当前数current_num == count ,则将该数设为candidate,同时count++;
  2. 2.如果candidate == current_num, 则count++;反之,则count--
  3. 3.当count减到0时,candidate再更新数据

如果数组中存在一个数出现次数大于数组长度的1/2,则最后的candidate一定为该数.


int findMajorityElement(vector<int> nums)
{
	int candidate, count = 0;
    for(const auto& current_num : nums){
        if(count == 0){
            candidate = current_num;
        }
        if(current_num == candidate){
            ++count;
        }else{
        	--count;   
        }
    }
    
    
    //检查candidate是否是出现次数超过一半的数
    //因为有可能数组中不存在超过一半的数
    int candidate_count = 0;
    for(const auto& n : nums){
        if(n == candidate){
            ++candidate_count;
        }
    }
    
    if(candidate_count > nums.size() / 2){
        return candidate;
    }else{ // 不存在超过一半的数
        return -1;
    }
    
}

posted @ 2024-10-11 22:58  RunTimeErrors  阅读(12)  评论(0编辑  收藏  举报