多数元素
方法一(哈希表)
利用哈希表来存储每一个元素以及元素出现的次数,当哈希表已经有该元素时,取出值并加一放入哈希表中,最后只需要遍历哈希表,找到值大于等于数组长度一半的键,返回即可。
public static int majorityElement(int[] nums) {
Map<Integer,Integer > map = new HashMap<Integer,Integer >();
for(int i=0;i<nums.length;i++){
if(!map.containsKey(nums[i])){
map.put(nums[i],1);
}else{
map.put(nums[i],map.get(nums[i])+1);
}
}
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue()>nums.length/2)
return entry.getKey();
}
return 0;
}
方法二(排序)
通过将数组从小到大进行排序,找到数组中间位置的元素,这个元素的数量必定大于等于数组长度的一半。
public static int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
方法三(摩尔投票法)
步骤:
1、维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count 为 0。
2、遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,先将 x 的值赋予 candidate,随后判断 x。
3、如果 x 与 candidate 相等,那么计数器 count 的值增加 1;如果 x 与 candidate 不等,那么计数器 count 的值减少 1。
4、在遍历完成后,candidate 即为整个数组的众数。
public static int majorityElement(int[] nums) {
int count = 0;
Integer candidate=null;
for(int num:nums){
if(count==0)
candidate=num;
if(num==candidate) count++;
else count--;
}
return candidate;
}