算法思想:
- 类似于投票选票机制,投票结果中,每张票相当于给某个数字或号码进行加权,当出现不同号码或数字时,相当于有人和当前的号码的权值抵消,最后一轮投票下来的号码一定是比其他号码的权重(出现的次数)都高,且权重(出现的次数) 大于总和的一半
算法优点:
- 将空间压缩到O(1),时间压缩到O(n)
实现代码:
class Solution {
public int majorityElement(int[] nums) {
return method3(nums);
}
public int method1(int[] nums){
int len=nums.length;
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
int ans=0;
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue()>len/2){
ans=entry.getKey();
break;
}
}
return ans;
}
public int method2(int[] nums){
int ans=0;
int len=nums.length;
if(len==1) return nums[0];
Arrays.sort(nums);
int count=1,temp=nums[0],index=1;
HashMap<Integer,Integer> map=new HashMap<>();
while(index<len){
while(index<len&&nums[index]==temp){
index++;
count++;
}
// 一段连续数结束
if(count>len/2){
ans=temp;
break;
}
temp=nums[index];
index++;
// count 从1开始
count=1;
}
return ans;
}
// 摩尔投票法
public int method3(int[] nums){
int ans=nums[0];
int count=1;
for(int i=1;i<nums.length;i++){
if(nums[i]!=ans){
if(count>0){
count--;
}else{
ans=nums[i];
count++;
}
}else{
count++;
}
}
return ans;
}
}