问题描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例1:
输入:[3,2,3] |
输出:3 |
示例2:
输入:[2,2,1,1,1,2,2] |
输出:2 |
解法一:暴力求解法
每次取数组中的一个数,通过计数来判断这个数的个数是否大于n/2。
代码实现:
public static int majorityElement1(int[] arr){
for (int i = 0; i < arr.length/2+1; i++) {
int temp = 1;
for (int j = i+1; j < arr.length; j++) {
if (arr[i] == arr[j]){
temp++;
}
}
if (temp > arr.length/2){
return arr[i];
}
}
return -1;
}
解法二:排序取中法
通过思考,我们发现只要将数组排序,那么元素个数大于n/2的元素一定处于中间位置。
代码实现:
public static int majorityElement2(int[] arr){
Arrays.sort(arr);
return arr[arr.length/2];
}
这个方法需要思考,但是想到了以后代码实现特别简单。
解法三:摩尔投票法
这个思想方法来源于现实生活,比如生活中选班长。
将第一个数作为标记,计数为一,从第二个元素开始,若这个元素与标记为元素相同,则计数加一,否则减一,当计数为零时,更换当前位置元素未标记位下面我们来做个示例:
代码实现:
public static int majorityElement3(int[] arr){
int candidate = arr[0];
int count = 1;
for (int i = 1; i < arr.length; i++) {
if (arr[i] == candidate){
count++;
}else {
count--;
if (count == 0){
candidate = arr[i];
count = 1;
}
}
}
return candidate;
}