题目:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
来源:力扣(LeetCode)
我的题解:
public int majorityElement(int[] nums) {
int count = 0;
int k = 0,i,j,z = 0;
int[] test = new int[100];
for(i = 0; i < nums.length; i++){
for(z = 0; z < test.length; z++){
if(test[z] == nums[i]){
j = nums.length;
break;
}
}
if (z == test.length) {
test[k++] = nums[i];
}
for(j = 0; j < nums.length; j++){
if(nums[i] == nums[j]){
count++;
}
}
if(count > nums.length/2){
return nums[i];
}
count = 0;
}
return 0;
}
比较冗余,且时间空间复杂度都比较高,只是通过简单的遍历加一点点优化;查看题解发现,可用摩尔投票法的思想。
摩尔投票法:
同样的通过题解的一个例子来说明摩尔投票法的含义。就像是诸侯混战,在数组中的每一个不相同的数为一诸侯,这个数的数量越多,则此诸侯兵力越强。现所有诸侯开战,开战中所有兵力的战斗力相同,即是一一对消的关系,可见,兵力的数量决定了战役的成功率。现试想,若一个诸侯的兵力超过了所有诸侯总兵力的一半,那么即使其他诸侯全部攻击他,那么他也是胜利的一方。这便是极端情况,因为现诸侯之间是互相攻击,所有根据一一抵消的情况去解这道题就可得出答案,通过遍历所有的士兵,若属于同一诸侯,那么将其加一,若不属于同一诸侯,那么就减一,最终剩下的士兵一定属于胜利的诸侯,即就是我们要找的数。
题解:
public int majorityElement(int[] nums) {
int count = 0;
int winer = 0;
for(int i = 0; i < nums.length; i++){
if (count == 0) {
winer = nums[i];
count++;
}else if(winer == nums[i]){
count++;
}else{
count--;
}
}
return winer;
}
以上所写的思路皆来自LeetCode中的题解中。