题目
https://leetcode-cn.com/problems/majority-element/submissions/
方法一:摩尔投票
代码
class Solution {
public int majorityElement(int[] nums) {
int can=nums[0];
int count=0;
for(int num:nums){
if(count==0){
can=num;
count++;
}
else{
if(num==can){
count++;
}
else{
count--;
}
}
}
return can;
}
}
复杂度
结果
方法二:分治
代码
class Solution {
public int majorityElement(int[] nums) {
return major(nums,0,nums.length-1);
}
//计算[lo,hi]范围内,nums中数字major的出现次数
public int count(int[] nums,int major,int lo,int hi){
int count=0;
for(int i=lo;i<=hi;i++){
if(nums[i]==major){
count++;
}
}
return count;
}
public int major(int[] nums,int lo,int hi){
//区间内只有一个数,这个数就是众数
if(lo==hi)
return nums[lo];
int mid=lo+(hi-lo)/2;
int left=major(nums,lo,mid);//左区间的众数
int right=major(nums,mid+1,hi);//右区间的众数
if(left==right)//相等,则找到了众数
return left;
//不相等
int count1=count(nums,left,lo,mid);//左区间众数出现次数
int count2=count(nums,right,mid+1,hi);//右区间众数出现次数
return count1>count2?left:right;
}
}