问题描述
给定一个大小为 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; }