栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode 169. 多数元素 (C++ | hash | 快排 | 摩尔投票算法)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode 169. 多数元素 (C++ | hash | 快排 | 摩尔投票算法)

题目描述

代码 哈希
public:
    int majorityElement(vector& nums) {
        unordered_map counts;
        int ans = 0, cnt = 0;
        int n = nums.size();
        for(int i = 0; i < n; i ++) {
            counts[nums[i]] ++;
            if(counts[nums[i]] > cnt) {
                ans = nums[i];
                cnt = counts[nums[i]];
            }
        }
        return ans;
    }
};


代码2 快排

class Solution {
public:
    int majorityElement(vector& nums) {
        sort(nums.begin(), nums.end());
        return nums[nums.size() / 2];
    }
};
代码3 摩尔投票算法

摩尔投票算法「时间复杂度O(n),空间复杂度O(1)」
我们根据在数组中出现次数将数字划分两类。
第一类,出现次数大于半数的数字,假设为x,也是要找的数字。
第二类,出现次数小于半数的数字,假设为y,出现次数小于半数的数字可能有很多种,因为具体是几不重要,我们可以统一设为y。
那么,x出现次数 - y出现次数 > 0。
因此,我们统计当前众数x,和x众数出现的次数count,遇到一个y,将count–;如果count=0,说明当前没有数字是众数;如果当前数字等于x,那么将count++。因为众数一定存在,所以最后x即为众数且count>0。 leetcode 官方题解

class Solution {
public:
    int majorityElement(vector& nums) {
        int count = 0, x = -1;
        for (int i = 0; i < nums.size(); i++) {
            if (count == 0) x = nums[i], count++;
            else if (nums[i] == x) count++;
            else count--;
        }
        return x;
    }
};

感谢阅读
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/929132.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号