目录
题目
给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
oj链接
法一:枚举法
首先遍历数组,将数组元素逐个取出,接着再遍历一遍数组统计其出现次数,当出现次数超过length/2时,即可返回结束方法。
图解
代码
public int majorityElement2(int[] nums) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
int cur = nums[i];
count = 1;
for (int j = 1; j < nums.length; j++) {
if(cur == nums[j]) {
count++;
}
}
if(count > nums.length/2) {
return cur;
}
}
return nums[0];
}
法二:排序返回中间元素
图解
代码
public int majorityElement3(int[] nums) {
int flg = 0;//有序
for(int i = 0;i < nums.length - 1;i++) {
flg = 0;
for(int j = 0;j < nums.length - 1 - i;j++) {
if(nums[j] > nums[j+1]) {
int tmp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = tmp;
flg = 1;
}
}
if(flg == 0) {
break;
}
}
return nums[nums.length/2];
}
法三:摩尔投票法
摩尔算法的核心思想是相互抵消。不知道大家小时候有没有玩过连连看的游戏,如果有两个一样的卡片就可以消除,摩尔算法的核心思想和连连看类似,不过摩尔算法是不一样的卡片消除,留到最后的就是多数的卡片。
代码
public int majorityElement1(int[] nums) {
int count = 0;
int candidata = 0;
for (int i = 0; i < nums.length; i++) {
if(count == 0) {
candidata = nums[i];
}
if(candidata == nums[i]) {
count++;
}else {
count--;
}
}
return candidata;
}