数组初体验之多数元素
多数元素
https://leetcode-cn.com/problems/majority-element/
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:输入: [2,2,1,1,1,2,2]
输出: 2
解法分析:
1)使用map记录 <元素,出现次数>
如果次数超过 n/2 即为要查找的元素
数组 [3,2,3]
map ❤️,1> <2,1> ❤️,2>
判断条件 2 > 3/2 = 1
public static int majorityElement(int[] nums) {
// map 记录元素出现个数
Map<Integer, Integer> map = new HashMap<>();
// 统计 多数元素 满足结果
int halfLen = nums.length / 2;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
// 元素次数 初始化是1
int count = 1;
if (map.containsKey(num)) {
count = map.get(num);
count++;
}
// 判断是否是多数元素
if (count > halfLen) {
return num;
}
System.out.println(num + "元素,存储次数为" + count);
map.put(num, count);
}
return -1;
}
2)排序后取中间元素
[3,2,3]
[2,3,3]
[2,2,1,1,1,2,2]
[1,1,1,2,2,2,2]
[1,1,1,2]
[1,2,2,2]
public static int majorityElement1(int[] nums) {
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
int halfLen = nums.length / 2;
return nums[halfLen];
}
3)投票算法
将元素当做候选人,如果新元素和候选人相同,次数+1, 不同次数-1(代表抵消)
如果次数=0,候选人更新
[2,2,1,1,1,2,2]
元素 次数 候选人
2 1 2
2 2
1 1
1 0
1 1 1
2 0
2 1 2
本质上 多数元素出现的次数 一定大于其他所有元素出现次数的总和 所以候选人的次数经过抵消后 最终剩余的一定是“多数元素”
public static int majorityElement2(int[] nums) {
// 候选人
int candidate = -1;
// 出现次数
int count = 0;
for (int i = 0; i < nums.length; i++) {
// 如果出现次数为0 重置候选人
if (count == 0) {
candidate = nums[i];
}
// 根据新元素是否等于候选人 进行次数的加减操作
if (candidate == nums[i]) {
count++;
} else {
count--;
}
System.out.println("元素" + nums[i] + ",次数" + count
+ ",候选人" + candidate);
}
return candidate;
}