题目
解题思路
有两种思路:
- 将数组首先进行排序,因为该题满足:1.一定存在多数元素。2.多数元素出现的次数超过n/2(向下取整)。所以排序后,直接取nums[n/2]即可,因为超过半数,所以中间位置的元素一定是所求的数字。
- 摩尔投票法,该题满足:1.一定存在多数元素。2.多数元素出现的次数超过n/2(向下取整)。多数元素的数量大于剩下元素的数量,先取一个数为候选的多数元素,为candidate,用count记录在candidate比别的元素出现得多的次数,即,每次出现candidate就把count加一,出现别的数就把count减一,当count为0的时候把candidate变为当前的数并继续操作。最后得到的candidate的值就是多数元素。因为,多数元素的数量是多于其它所有数的和的,如果candidate选定为多数元素,那么count就是在计算多数元素比别的元素出现的次数多多少次,当然最后会是candidate留下来;那如果candidate选错了,选的是别的数,那别的数的计数数目互相抵消掉一部分,剩下的数中多数元素还是占多,最终还是会变回多数元素。
代码1
class Solution {
//中间蛇法(长于管长一半的蛇,在管道中间砍一刀,一定会砍到蛇)
public int majorityElement(int[] nums) {
int n=nums.length;
Arrays.sort(nums);
// for(int i=0;i<nums.length;i++){
// for(int j=0;j<nums.length-i-1;j++){
// if(nums[j]>nums[j+1]){
// int tmp;
// tmp=nums[j];
// nums[j]=nums[j+1];
// nums[j+1]=tmp;
// }
// }
// }
// for(int i:nums){
// System.out.print(i);
// }
return nums[(n/2)];
}
}
代码2
class Solution {
//摩尔投票法
public int majorityElement(int[] nums) {
int n=nums.length;
int result;
int count=1;
result=nums[0];
for(int i=1;i<nums.length;i++){
if(count==0) {
result=nums[i];
count=1;
continue;
}
if(nums[i]==result) count++;
else count--;
}
return result;
}
}
}
}