题目
方法一:哈希
记录每个数出现的次数,如果超过数组数量的一半,则该数为结果
public int majorityElement(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
int len = nums.length , tmp = 0;
for(int num : nums){
tmp = map.getOrDefault(num,0);
if(tmp + 1 > len / 2)
return num;
map.put(num,tmp + 1);
}
return 0;
}
- 时间复杂度:需要遍历一遍数组,O(n)
- 空间复杂度:需要额外空间记录元素出现的次数,O(n)
方法二:多数投票法
通过两个变量,candidate记录当前假设的多数元素,count记录数量。遍历数组,如果若count==0,则将当前遍历元素假设为candidate,若nums[i]==candidate,则count++,如果nums[i]!=candidate,则count–。
public int majorityElement(int[] nums) {
int count = 0 ,candidate = 0;
for(int num : nums){
if(count == 0)
candidate = num;
if(num == candidate)
count++;
else
count--;
}
return candidate;
}
- 时间复杂度:遍历一遍数组,O(n)
- 空间复杂度:O(1)