题目:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
思路:
-
找重复元素就可以想到hash表,之前找两个数组的重复元素用到hash表,一个数组中的对也用到hash表。
-
找重复元素:排序后,用双指针,之前找两个数组的重复元素也是将元素排序双指针。由于比较特殊,不需要双指针,出现次数最多的就直接是nums[nums.length/2];
方法一:哈希表
遍历数组。碰到元素就添加,这里有个技巧,map.put(num, map.getOrDefault(num, 0) + 1); 添加的是新元素时,会得到0再加1,比较方便。
class Solution {
public int majorityElement(int[] nums) {
// 维护一个HashMap,里面存放键和键出现的次数
// 当出现此处大于n/2时,返回
if(nums == null || nums.length <= 0) return 0;
int N = nums.length;
int res = -1;
HashMap<Integer, Integer> map = new HashMap();
for(int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
if(map.get(num) > N/2) res = num;
}
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(n)
方法二:排序
- 找重复元素:排序后,用双指针,之前找两个数组的重复元素也是将元素排序双指针。由于比较特殊,不需要双指针,出现次数最多的就直接是nums[nums.length/2];
对于每种情况,数组下面的线表示如果众数是数组中的最小值时覆盖的下标,数组下面的线表示如果众数是数组中的最大值时覆盖的下标。对于其他的情况,这条线会在这两种极端情况的中间。对于这两种极端情况,它们会在下标为 n/2的地方有重叠。因此,