您的位置:首页 > 其它

leetcode 169. Majority Element

2017-07-03 13:27 417 查看
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.
这一题是一道锻炼思维的好题。
我用的是map方法。

package leetcode;

import java.util.HashMap;

public class Majority_Element_169 {

public int majorityElement(int[] nums) {
int n=nums.length;
HashMap<Integer, Integer> map=new HashMap<Integer, Integer>();
for(int i=0;i<n;i++){
int count=map.getOrDefault(nums[i], 0)+1;
if(count>n/2){
return nums[i];
}
map.put(nums[i],count);
}
return -1;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Majority_Element_169 m=new Majority_Element_169();
int[] nums=new int[]{1,2,3,3,3};
System.out.println(m.majorityElement(nums));
}

}大神则表示,有四种方法可以解决这道题:(sorting, hashmap, moore voting, bit manipulation)。map我用了,下面展示另外三种解法。
1. sorting.

// Sorting
public int majorityElement1(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}2. moore voting.
//Moore voting algorithm
public int majorityElement(int[] nums) {
int major=nums[0];
int count = 1;
for(int num:nums){
if(count==0){
count++;
major=num;
}else if(major==num){
count++;
}else{
count--;
}
}
return major;
}我下一篇博文将会详细介绍Moore's voting算法。
3. bit manipulation.

这一题跟Single Number II (leetcode problem 137)有相似之处。

对于整数的32位bit,我们可以对于32中的每一个bit位置,来遍历所有数字,得到所有数字中,这一bit位上是0占大多数还是1占大多数。如果1占大多数,那么majority element上这一位肯定是1。by follow this,我们可以用32次循环来“构造出”我们想要得到的majority element。
public int majorityElement(int[] num) {

int ret = 0;

for (int i = 0; i < 32; i++) {

int ones = 0, zeros = 0;

for (int j = 0; j < num.length; j++) {
if ((num[j] & (1 << i)) != 0) {
++ones;
}
else
++zeros;
}

if (ones > zeros)
ret |= (1 << i);
}

return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: