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;
}
}