多数元素-----题解报告

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这一题仔细阅读题目意思就会发现,主要就是找众数,并且题目中明确告知,给出的数组中必然有出现次数超过n/2的元素。

那就很简单了,有一个很偷懒的方法,对数组进行排序,那么第n/2个元素必然是众数。

这也太简单了,只需要两行代码

public int majorityElement(int[] nums) {
       Arrays.sort(nums);
        return nums[nums.length/2];
   }

多数元素-----题解报告_第1张图片

但是,有没有更快的方法?当然有,接下来就是本篇题解的重点------摩尔投票

这个算法很好理解,首先我们要明确两个推论

  • 当令众数的key值为1,非众数的key值为-1时,整个数组所有的key值相加必然是大于0的
  • 在遍历数组的过程中,若出现下标为a时,key值为0,那么(n-a)中所有key值相加必然大于0,也就是说在(n-a)的部分中众数任然不变

那么我们就只要在遍历数组的时候,判断当前key值之和sum是否为0,为0则更新总数x;

不为0则判断当前元素和x是否相等,相等则sum++,反之则sum--;

数组遍历结束之和,返回x即可。

public int majorityElement(int[] nums) {

        int k=nums[0], m=1;
        for(int i=1;i< nums.length;i++)
        {
            if(m==0)
            {
                k=nums[i];
            }
            if(nums[i]==k)
            {
                m++;
            }
            else
            {
                m--;
            }
        }
        return k;
    }

多数元素-----题解报告_第2张图片

你可能感兴趣的:(题解,算法,数据结构)