目录
题目描述
前置知识
代码
方法一 排序法
思路
实现
复杂度
方法二 哈希表
思路
实现
题目描述
给定一个大小为
n
的数组nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素
示例 1:
输入:nums = [3,2,3] 输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2] 输出:2
前置知识
- 哈希表
代码
方法一 排序法
思路
如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为的元素(下标从 0 开始)一定是多数
实现
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
}
复杂度
- 时间复杂度:O(nlogn)。将数组排序的时间复杂度为 O(nlogn)
- 空间复杂度:O(logn)
方法二 哈希表
思路
- 我们知道出现次数最多的元素大于 次,所以可以用哈希表来快速统计每个元素出现的次数。
实现
class Solution {
private Map<Integer, Integer> countNums(int[] nums) {
Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
for (int num : nums) {
if (!counts.containsKey(num)) {
counts.put(num, 1);
} else {
counts.put(num, counts.get(num) + 1);
}
}
return counts;
}
public int majorityElement(int[] nums) {
Map<Integer, Integer> counts = countNums(nums);
Map.Entry<Integer, Integer> majorityEntry = null;
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
majorityEntry = entry;
}
}
return majorityEntry.getKey();
}
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)