数组中出现超过数组长度一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
思路一:哈希法。我们可以创建一个HashMap。其中键为数组中的元素,其对应的值为该元素在数组中出现的次数。
时间复杂度:O(n)。 空间复杂度:O(n)
当我们将数组中的某个元素放入HashMap中,首先判断它是不是在HashMap中已经存在,如果存在,得到其对应的value,并加1(因为value对应的是该元素在数组中出现的次数)。如果不存在,则将该元素作为HashMap中的key存入map集合,并将其对应的value设置为1(因为该元素第一次添加到map集合中,所以value设置为1)。当我们某个元素已经存在于map集合中,我们拿到其对应的value,然后判断该value是否大于数组长度的一半。如果是,则直接return该key。
特殊地,如果数组长度为1,我们需要对这种情况单独做一个判断。
代码实现:
public static int majorityElement(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i<nums.length;i++){
if(map.containsKey(nums[i])){
map.put(nums[i],map.get(nums[i])+1);
if (map.get(nums[i])> nums.length>>1){
return nums[i];
}
}else{
map.put(nums[i],1);
}
}
if (nums.length == 1) return nums[0];
// 如果没有出现次数超过数组一半长度的元素,则返回-9999
return -9999;
}
思路二:将数组排序,则数组中间的元素,一定是众数。
时间复杂度:O(nlogn),空间复杂度:O(1)
代码实现:
public static int majorityElement2(int[] nums){
Arrays.sort(nums);
return nums[nums.length/2];
}