算法专题:投票法

看这篇总结:【算法】摩尔投票法 找 多数元素_小威W的博客-CSDN博客

169.多数元素(找频率>n/2,且多数元素一定存在)

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -10^9 <= nums[i] <= 10^9

思路

这道题目是找出现频率高于n/2的元素,是投票法。

投票法(Boyer-Moore Voting Algorithm)是一种用于在数组中查找主要元素的算法,主要元素定义为一个元素出现次数超过数组长度的一半。它并不一定能找到频率最高的元素,例如在数组 [1, 2, 2, 3, 3, 3] 中,频率最高的元素是 3,但没有元素出现次数超过数组长度的一半,因此投票法不会返回任何元素。如果数组 [1, 1, 2, 2, 3, 3, 3, 3] 中,频率最高的元素也是主要元素,这时投票法会返回元素 3

如果一个元素是数组的多数元素(出现次数超过数组长度的一半),那么即使我们把它和其他每个不同的元素一一抵消(每次都从数组中删除两个不同的元素),最后剩下的一定是这个多数元素

  • 基本的投票法是找**数组中出现频率超过半数(必须是超过不能是等于)**的元素。
  • 数组中出现频率超过半数的元素,一定只有一个

完整版

class Solution {
   
public:
    int majorityElement(vector<int>& nums) {
   
        int ans=-1,count=0;
        for(int num:nums){
   
            if(count==0) ans = num;
            //这样写的话,else会和直接相邻的上一个if组成if-else
            if(num==ans) count++;
            else count--;
        }
        return ans;//注意ans就是多数元素!
    }
};

补充:

在C++中,else语句总是与最近的一个未配对的if语句进行配对。因此,上面写法中,else语句是与第二个if语句配对的,形成了一个if-else结构。

上面是比较直观的写法,也可以换成另一种逻辑更清晰的:

class Solution {
   
public:
    int majorityElement(vector<int>& nums) {
   
        int ans=-1,count=0;
        for(int num:nums){
   
            if(count==0) ans = num;
            count += (num==ans)?1:-1;     
        }
        return ans;//注意ans就是多数元素!
    }
};

注意点</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值