169. Majority Element

问题

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

 

翻译

给定大小为n的数组,找到主元素,即出现次数多于n/2向下取整。假设数组非空且存在主元素。

 

算法出处http://www.cs.utexas.edu/~moore/best-ideas/mjrty/

代码:

详细内容可以读一下作者的论文,这里我简单说下自己的理解

最近在听《明朝那些事儿》,元末明初农民起义的部分,所以以攻占城池作为例子。注意这里有个重要前提是主元素出现次数多于n/2向下取整。假设相同数字对应的是同一伙人,不同数字对应不同势力,大家都想攻占城池,如下:

public class Solution {
    public int majorityElement(int[] num) {
        int major=num[0], count = 1;//最先到的先占领城池,也就是数组中第一个元素
        for(int i=1; i<num.length;i++){//数组中的人依次到来,对每个新来的做如下处理
            if(count==0){//count==0,说明之前不同势力的人同归于尽了
                count++;//count++,也就是count=1,即之前的人同归于尽了,那么这个新来的就占领了城池,且己方力量为1(目前只有他自己)
                major=num[i];//新来的占领城池,也就是major
            }else if(major==num[i]){//count不为0,有之前的残余势力,那么需要判断,这个势力是不是自己人,是自己人的话
                count++;//己方力量加一
            }else count--;//不是自己人,自己需要拿出一个人和新来的同归于尽,己方力量减一
            
        }
        return major;
    }
}
经过上述计算,由于主元素出现次数多于n/2向下取整,也就是说,即使其它所有势力加起来和主势力作对,也打不过,主势力最少也会剩一个。因此,最后占据城池的一定是主势力。也就是返回的major。

贴一下我自己的代码,比起上述算法,我的算法复杂性为nlogn,有个排序过程

import java.util.Arrays;
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);

int majority = nums[0];
int nowNum = 1;
int majNum = 0;

for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - 1]) {
nowNum++;
if (nowNum > majNum) {
majority = nums[i];
majNum = nowNum;
}
}
else
nowNum=1;

}
return majority;
}
}

posted @ 2018-02-14 18:50  同销万古愁  阅读(96)  评论(0编辑  收藏  举报