169. 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法一
如果一个数出现次数大于总数的1/2那么最中间的数一定复合条件
class Solution {
public int majorityElement(int[] nums) {
//排序,然后找到中间的数
Arrays.sort(nums);
int length = nums.length;
return nums[length/2];
}
}
解法二
关于元素数量的问题我们很容易想到使用hashmap的特性进行求解,key为nums[i],value为出现的次数
class Solution {
public int majorityElement(int[] nums) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int ans = 0;
for(int i = 0; i < nums.length; i++){
if (!map.containsKey(nums[i])){
map.put(nums[i], 1);
} else {
map.put(nums[i], map.get(nums[i])+1);
}
//如果value大于nums.length/2则为找到这个数
if (map.get(nums[i]) > nums.length/2) {
ans = nums[i];
break;
}
}
return ans;
}
}
解法三
使用摩尔投票法进行解题,核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)O(N)O(N) 和 O(1)O(1)O(1) ,为本题的最佳解法。
class Solution {
public int majorityElement(int[] nums) {
int count = 0;
Integer flag = null;
for( int num:nums){
if(count ==0){
flag=num;
}
if(num==flag){
count++;
}else{
count--;
}
}
return flag;
}
}