面试题 17.10. 主要元素

面试题 17.10. 主要元素

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

 

解题思路

方法一:map,此方法时间复杂度O(n),空间复杂度O(n)

方法二:排序+双指针,此方法时间复杂度O(nlog2n),空间复杂度O(1)

方法三:投票法

 

方法一:map

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int> map;
        for(int i : nums) {
            map[i] ++;
            if(map[i] > nums.size() / 2) return i;
        }
        return -1;
    }
};

方法二:排序+双指针

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        for(int i = 0, j = 0; j < nums.size(); i = j) {
            while(j < nums.size() && nums[i] == nums[j]) j ++;
            if(j - i > nums.size() / 2) return nums[i];
        }
        return -1;
    }
};

方法三:投票法

#include<iostream>
#include<bits/stdc++.h>
#include<cstring>
#include<vector>
#include<map>
using namespace std;

int getMainElem(vector<int>vec){
    int x,vote;
    for (int i = 0; i < vec.size(); i++)
    {

        if (vote==0)
        {
            x=vec[i];
        }
        vote+=(vec[i]==x)?1:-1;
    }
    vote=0;
    for (int i = 0; i < vec.size(); i++)
    {
        if (vec[i]==x)
            vote++;
    }
    if (vote>=vec.size()/2)
    {
        return x;
    }else
    {
        return -1;
    }
}

int main(){
    int arr[]={1,2,5,9,5,9,5,5,5};
    vector<int>vec(arr,arr+9);
    cout<<getMainElem(vec);
}

 

posted @ 2020-09-22 20:53  多发Paper哈  阅读(92)  评论(0编辑  收藏  举报
Live2D