面试题 17.10. 主要元素

一、题目介绍

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

猜你喜欢

转载自blog.csdn.net/weixin_44925547/article/details/115273417