169. 多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

1
2
输入:[3,2,3]
输出:3

示例 2:

1
2
输入:[2,2,1,1,1,2,2]
输出:2

进阶:

  • 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

题解:

1.哈希表法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public int majorityElement(int[] nums) {
//使用一个哈希表,数组元素做为键,出现次数作为值
HashMap<Integer, Integer> map = new HashMap<>();

int len = nums.length;

for (int i = 0; i < len; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}

for (Integer key : map.keySet()) {
if (map.get(key) > len / 2) {
return key;
}
}
return -1;

}
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

2. 排序

思路:将数组中的元素按照递增或者递减的顺序排序,那么下标为n/2的元素一定是众数,即“多数元素”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int majorityElement(int[] nums) {

/*
*
* 例子:
*
* 原始数组:1 2 1 1 3
* 排序数组:1 1 1 2 3
*
* 原始数组:2 2 1 2 3
* 排序数组:1 2 2 2 3
*
*
* 原始数组:3 2 1 3 3
* 排序数组:1 2 3 3 3
* */
Arrays.sort(nums);
int n = nums.length;
return nums[n / 2];
}
  • 时间复杂度:O(nlogN),主要是排序花费的时间。
  • 空间复杂度:O(logN),数组排序的空间复杂度需要使用O(logN)的栈空间。