数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
题目链接:看完本篇题解可以点开来巩固一下~~
解题思路:
方法一:时间复杂度O(n)。用 HashMap 这一数据结构进行存储,遍历数组,每次取出该元素出现的次数,如果次数超过数组长度一半,则直接返回该元素;若没有,则将元素出现次数 +1 后放回。
Java解决问题代码如下:
class Solution {
public int majorityElement(int[] nums) {
int len = nums.length;
HashMap<Integer, Integer> map = new HashMap<>();
for(int num : nums) {
int count = map.getOrDefault(num, 0);
if(count >= len / 2) {
return num;
}
map.put(num, count + 1);
}
return -1;
}
}
方法二:时间复杂度O(n),空间复杂度O(n)。假设一个数出现次数超过数组长度一半,那么此元素必定在该数组排序后的中间下标。
Java解决问题代码如下:
import java.util.*;
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
int len = nums.length;
return nums[len / 2];
}
}