题目
给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于n/2的元素。假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
输入:[3,2,3]
输出:3
解法一:map
public static int most_occurrences1(int[] nums){
Map<Integer,Integer> map = new HashMap<>();
int halflen = nums.length/2;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
int count =1;
if (map.containsKey(num)){
count=map.get(num);
count++;
}
if (count > halflen){return num;}
map.put(num,count);//同样的key,不同的value会覆盖。
}
return -1;
}
时间复杂度:O(n);
空间复杂度:O(n).
解法二:投票算法
思路:把第一个元素当做候选元素(可能的多数元素),设置count计数候选元素个数。当下一个元素等于候选元素时,count++;当下一个元素不等于候选元素时,count–。当count == 0时,更换候选元素。
public static int most_occurrences2(int[] nums){
int candidate =-1;
int count =0;
for (int i = 0; i < nums.length; i++) {
if (count==0){candidate=nums[i];}
if (candidate==nums[i]){count++;}
else {count--;}
}
return candidate;
}
时间复杂度:O(n);
空间复杂度:O(1)。