一、题目介绍
数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
示例1:
输入:[1,2,5,9,5,9,5,5,5]
输出:5
示例2:
输入:[3,2]
输出:-1
二、题解
1.排序后验证中间元素
时间:O(nlogn) 空间:O(1)
代码如下:
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
int majorityElement = nums[nums.length/2];
int number=0;
for (int num : nums) {
if (num == majorityElement){
number++;
}
}
if (number>nums.length/2){
return majorityElement;
}
return -1;
}
}
2.摩尔投票法
时间:O(n) 空间:O(1)
摩尔投票法:
该算法的最简单的形式,查找最多出现的元素,也就是找到一个输入中出现一半以上的重复元素。但是,如果该数不存在的话,算法将检测不到真实结果,但是仍将输出输入元素中的一个元素。 但是,我们可以再次遍历输入序列,计算返回元素出现的次数,以确定它是否真的是众数。
该算法在其局部变量中维护一个临时变量m和一个计数器c,计数器初值为零。 然后我们遍历序列中的每个元素。如果c=0,则m=x;c=1;(其中x表示我们遍历到的元素)。 如果m==x,那么c++,否则c- -。 最后返回m即可。
这可以用伪代码表示为以下步骤:
1、初始化一个元素m和一个计算器c=0
2、对于输入序列中的每个元素x,如果i=0,m== x, 那么c++,否则的话c- -
3、返回m
代码如下:
int majorityElement(int* nums, int numsSize){
int c=0;
int m=0;
for(int i=0;i<numsSize;i++)
{
if(c==0)
{
m=nums[i];
c++;
}
else if(m==nums[i])
c++;
else
c--;
}
int count=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]==m)
count++;
}
//验证是否为众数
if(count>=(numsSize+1)/2)
return m;
else
return -1;
}