多数元素

leetCode–169(多数元素)

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

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

示例 1:

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

示例 2:

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

解法一:哈希表

使用hash表来存放每个元素出现的次数,最后遍历hash 返回次数 > len/2 的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int majorityElement(int[] nums) {
int n = nums.length;
if (n<=2) return nums[0];
int len = n/2;
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0;i<n;i++){
if (map.containsKey(nums[i])) map.put(nums[i],map.get(nums[i])+1);
else map.put(nums[i],1);
}
for (int key:map.keySet()){
if (map.get(key)>len) return key;
}
return -1;
}
}

解法二:排序

我的:先对数组进行排序,后进行遍历。。

我:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int majorityElement(int[] nums) {
int n = nums.length;
if (n<=2) return nums[0];
int len = n/2;
Arrays.sort(nums);
int count = 0;
for (int i = 0;i<n-1;i++){
if (nums[i]==nums[i+1]) count = count + 1;
else count = 0;
if (count+1>len) return nums[i];
}
return -1;
}
}

傻呀傻,,看看人家官方的。。充分利用了众数的性质。

代码为:

1
2
3
4
5
6
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}

绝了!

解法三:投票方法

如果遇见相等的数加1,遇见不相等的数减 1.

众数个数至少比非众数多一,把COUNT加减当作一个众数抵消掉一个非众数,剩下的一定是众数。

代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int majorityElement(int[] nums) {
int n = nums.length;
if (n<=2) return nums[0];
int count = 0;
int a = 0;
for (int i = 0;i<n;i++){
//如果为0 说明众数和非众数打个平手
if (count==0) a = nums[i];
//相等加1 不相等减 1
count += (nums[i]==a)?1:-1;
}
return a;
}
}

解法四:分治算法

没看懂~~


多数元素
http://example.com/2022/06/07/多数元素/
作者
zlw
发布于
2022年6月7日
许可协议