【程序员面试金典】面试题 17.10. 主要元素

【程序员面试金典】面试题 17.10. 主要元素

    • 题目描述
    • 解题思路

题目描述

描述:数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -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

解题思路

思路:最直观的想法是,遍历数组并使用哈希表统计元素以及元素出现的次数,然后遍历哈希表找出次数大于数组长度一半的元素并返回。

class Solution {
public:
    int majorityElement(vector& nums) {
        unordered_map umap;
        for(auto num:nums)
            umap[num]++;
        int res=-1;
        int n=nums.size();
        for(auto u:umap)
        {
            if(u.second>(n/2))
            {
                res=u.first;
                break;
            }
        }
        return res;
    }
};

优化:上述空间复杂度为O(n),但是题目要求空间复杂度为O(1),那么该如何优化呢?两次遍历!摩尔投票!将两个不同的元素进行抵消,如果最后有元素剩余,则该剩余元素可能是元素个数大于总数一半的那个!设置一个票数votes,设置一个候选数x。第一遍遍历数组,如果前面票数为0,则将当前元素设置为候选数,如果当前元素等于候选数则票数加一,反之票数减一。再次遍历数组,判断当前元素等于候选数的个数,如果最后个数大于数组长度一半则返回该候选数,反之返回-1。

int majorityElement(vector& nums) 
{
  //票数
  int votes=0;
  //众数
  int x=-1;
  int n=nums.size();
  for(int i=0;in?x:-1;
}

总结:摩尔投票可用于解决众数问题!

你可能感兴趣的:(程序员面试金典,面试,leetcode,职场和发展)