ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-09 09:32:46  阅读:288  来源: 互联网

标签:count 力扣 面试题 遍历 nums 元素 候选 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的元素】
由于是寻找出现次数较多的元素,所以可以采用抵消法的思想

  • 当查找出现次数超过n/2(本题,n为数组元数个数):
    • (1)初始候选设置为首个元素,计数为0
    • (2)遍历数组,相同则计数+1,不同则计数-1,当计数为0时说明前面元素均抵消,则记录下一个元素为候选
    • (3)遍历结束后,如果存在符合要求的众数元素,则其值必定为候选,是否存在需要进行二次遍历才能判断
  • 当查找出现次数超过n/3,变形题,思路类似,区别在于要分别设置两个候选及其计数,因为出现次数超过n/3的元数最多可能会有两个数
  • 以此类推,涉及类似问题,就看m的大小,设置m-1个候选即可,遍历完毕后再对候选进行二次遍历判断即可

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有