数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素.
思路一:排序
若数字的出现的次数超过数组长度的一半,那么将该数组从小到大排序,返回数组最中间那个值便是我们所求的数字了。
思路二:摩尔投票法
票数和: 由于众数出现的次数超过数组长度的一半;若记 众数 的票数为 +1,非众数 的票数为−1 ,则一定有所有数字的 票数和 >0。
因此先假设数组中第一个数为众数,此时vote = 0,因此 vote+1,然后再到第二个数,若第二个数与众数(第一个数)相同,则vote++,否则vote-1,此时vote = 0,因此假设第三个数为众数,以此类推,代码如下:
class Solution {
public int majorityElement(int[] nums) {
int vote = 0;
int x = 0;
for(int num : nums){
if(vote == 0) {
x = num;
}
//vote += num == x ? 1: -1
if(num == x){
vote++;
}else{
vote--;
}
}
return x;
}
}