题目
给定一个大小为 n
**的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: nums = [3,2,3]
输出: 3
题解
方式一:哈希表
找出每个元素出现的次数,返回出现次数最多的
复杂度:O(n)
public int majorityElement(int[] nums) {
// 用于记录每个元素出现的次数
HashMap<Integer, Integer> countMap = new HashMap<>();
// 遍历数组
for (int num: nums) {
// 如果元素已经在 map 中,将其出现次数加 1
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
// 用于记录出现次数最多的元素
int result = nums[0];
// 用于记录出现的最大次数
int count = 0;
// 遍历 map 找出出现次数最多的元素
for (Map.Entry<Integer, Integer> entry: countMap.entrySet()) {
if (entry.getValue() > count) {
result = entry.getKey();
count = entry.getValue();
}
}
return result;
}
方式二:摩尔投票法
不好验证正确性
摩尔投票法的核心思想是在每一轮投票过程中,从数组中找出一对不同的元素并将其从数组中删除,直到数组为空或只有一种元素。由于多数元素的数量超过数组长度的一半,所以最后剩下的元素必然是多数元素
public int majorityElement(int[] nums) {
// 初始化众数为数组的第一个元素
int candidate = nums[0];
// 初始化票数为 1
int count = 1;
// 遍历数组
for (int i = 1; i < nums.length; i++) {
if (nums[i] == candidate) {
// 如果当前元素等于众数,票数加 1
count++;
} else {
// 如果当前元素不等于众数,票数减 1
count--;
if (count == 0) {
// 如果票数为 0,更换众数为当前元素,并将票数重置为 1
candidate = nums[i];
count = 1;
}
}
}
return candidate;
}
总结
哈希表