其他分享
首页 > 其他分享> > 【LeetCode/力扣】面试题 17.10. 主要元素(摩尔投票法)

【LeetCode/力扣】面试题 17.10. 主要元素(摩尔投票法)

作者:互联网

1 题目描述

题目链接:https://leetcode-cn.com/problems/find-majority-element-lcci/


数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。


示例 1:

输入:[1,2,5,9,5,9,5,5,5]
输出:5
示例 2:

输入:[3,2]
输出:-1
示例 3:

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

2 代码/C++

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int count = 0, c = -1; // 定义众数计数和候选
        for(auto &p : nums){   
            if (count == 0){  // 当计数为0,则赋值当前数到候选c,计数加1
                c = p;
                count++;
            }
            else if (p == c){ // 当计数不为0,且当前值等于候选c,则计数加1
                count++;
            }
            else{            // 当计数不为0,且当前值不等于候选c,则计数减一(抵消)
                count--;
            }
        }
        
        count = 0;
        for (auto &p : nums){  // 二次遍历,计算候选c的出现次数
            if (p == c){
                count++;
            }
        }
        return count*2 > nums.size()? c : -1; // 如果候选c超过一半则返回c,否则返回-1
    }
};

3 代码解释

今天又学习到了一个方法,叫做“摩尔投票法”
摩尔投票法可以用于【查找列表中出现次数大于n/m的元素】
由于是寻找出现次数较多的元素,所以可以采用抵消法的思想

标签:count,力扣,面试题,遍历,nums,元素,候选,17.10,计数
来源: https://blog.csdn.net/baidu_35231778/article/details/118596771