找出现次数大于n/2的数
//排序
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];//java 默认向下取整,即5/2=2
}
//摩尔投票法:当一个数投票数相等时+1,不等时-1,要注意判断当-1后,票数是否为0,若为0则先把当前这个数存为待投票的数
public int majorityElement(int[] nums) {
int count=1,ans=nums[0];
for(int i=1;i<nums.length;i++){
if(nums[i]!=ans){
count--;
if(count==0){
ans=nums[i];
count=1;
}
}
else count++;
}
return ans;
}
找出现此数大于n/3的数
摩尔投票法,同理找出大于n/3的数,就选m个候选人,先投票再计分
leetcode 229
public List<Integer> majorityElement(int[] nums) {
// 创建返回值
List<Integer> res=new ArrayList<>();
if(nums==null ||nums.length==0) return res;
// 初始化两个候选人candidate,和他们的计票
int cad1=nums[0],cad2=nums[0];
int count1=0,count2=0;
// 摩尔投票法,分为两个阶段:配对阶段和计数阶段
// 配对阶段
for(int num:nums){
// 投票
if(num==cad1){
count1++;
continue;
}
if(num==cad2){
count2++;
continue;
}
// 第1个候选人配对
if(count1==0){
cad1=num;
count1++;
continue;
}
// 第2个候选人配对
if(count2==0){
cad2=num;
count2++;
continue;
}
count1--;
count2--;
}
// 计数阶段
// 找到了两个候选人之后,需要确定票数是否满足大于 N/3
count1=0;
count2=0;
for(int num:nums){
if(num==cad1) count1++;
else if(num==cad2) count2++;
}
if(count1>nums.length/3) res.add(cad1);
if(count2>nums.length/3) res.add(cad2);
return res;
}