Majority Element
来自 <https://leetcode.com/problems/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 ⌋次。假设数组不为空并且数组中一定存在最主要元素。
解析:
解法一:对数组中的元素由大到小或由小到大进行排序,返回位置⌊ n/2 ⌋的元素就是最主要元素。
解法二:
Moore's voting algorithm算法
算法的基本思想是每次找出一对不同的元素,重数组中删掉,直到数组为空或只有一种元素。不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e。
在遍历开始之前,记最主要的元素majority为空。其出现的此时count=0,
然后遍历数组nums时,如果count=0,表示当前没有候选元素,也就是说之前便利过程中没有找到超过半数的元素,那么如果超过半数的元素majority存在,那么剩下的子数组中,出现次数也一定超过半数。因此我们可以将院士问题转化为其它的子问题,此时majority为当前元素,同时count=1.
如果当前元素nums[i]==majority,那么count++.(没有找到不同元素,只需要把相同的元素累计起来)。
如果当前元素nums[i]!=majority,那么count--.(相当于删除一个majority)
如果遍历结束后,count不为0,那么元素majority即为要寻找的元素。
解法三:
用Map进行实现,将数组元素作为key,将该元素出现的次数作为key所对应的value值。Map初始化为空,当遇见一个新的数组元素时,先直接将该元素作为key值存放到Map中,其对应的value值为1.下次再遇见该元素,则直接将value值加1即可。数组遍历结束后,取出value大于⌊ n/2 ⌋所对应的key值就是要寻找的最主要的元素。
解法四:
这个方法是看了Solution之后才知道的,这里假设数据值范围为(1,2^32-1),那么我们需要一个32个元素的list,初始值都为0。这里的32表示元素转换成二进制之后的32位数。对于每一位数,遍历数据list里的所有数,记录该位为1的个数。如果个数>=len(num)/2+1,则该位为1,否则为0。同理算出每一位,再转换成10进制数即为出现次数最多的数
来自 <http://www.tuicool.com/articles/EFbAnqa>
解法一代码:
public int majorityElement(int[] nums) {
if(null == nums)
return 0;
Arrays.sort(nums);
return nums[nums.length/2];
}
解法一性能:
解法二代码:
public int majorityElement(int[] nums) {
if(nums == null)
return 0;
int count = 0;
int majority=0;
for(int i=0; i<nums.length; i++) {
if(0 == count) {
majority = nums[i];
count = 1;
} else if(majority == nums[i]) {
count++;
} else {
count --;
}
}
return majority;
}
解法二性能:
解法三代码:
public int majorityElement(int[] nums) {
HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
for(int a: nums) {
if (count.containsKey(a)) {
count.put(a, count.get(a)+1);
} else {
count.put(a, 1);
}
}
for(int item : count.keySet()) {
if(count.get(item) > (nums.length/2)) {
return item;
}
}
return 0;
}
解法三性能:
解法四代码:
解法四代码:
public int majorityElement(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int[] dig = new int[32];
for (int i = 0; i < nums.length; i++) {
int temp = nums[i];
for (int j = 0; j < 32; j++) {
dig[j] += temp & 1;
temp = temp >> 1;
}
}
int count = nums.length / 2;
int res = 0;
int temp = 1;
for (int i = 0; i < 32; i++) {
if (dig[i] > count)
res = res | temp;
temp = temp << 1;
}
return res;
}
解法四性能: