题目描述:
给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
未看题解前自己的解决方案:
思路:
- 使用map集合来存储<数字,数字出现个数>,这样最多只要遍历一遍数组就可以得到所有数字及其出现次数
- 因为只要出现次数count大于[n/2]的元素就可以划分为多数元素,那么只要在每一次count++的时候判断是否count > n/2,符合的话结束遍历数组,直接返回count对应的数字,即找到了多数元素
代码:
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
if(nums.length <= 1)
return nums[0];
for(int i=0;i<nums.length;i++){
Integer count = map.get(nums[i]);
if(count == null){
map.put(nums[i],1);
}
else {
if (count+1 > nums.length/2)
return nums[i];
map.put(nums[i], count + 1);
}
}
return -1;
}
}
- 但是发现题目解是解出了,但是时间复杂度和空间复杂度都不小,于是参考题解优化解决方案
优化后的解决方案:
思路:
-
多数元素的定义是指在数组中出现次数 大于
⌊ n/2 ⌋
的元素。那么也就是说多数元素出现的次数是数组内其他所有元素出现的次数之和还要多,那我们可以参考五军拼杀对决的游戏方式,只要一个元素的出现次数减去所有元素的次数后,还能保持count大于0,那么该数就为多数元素 -
那么定义一个计数器变量count来计数当前多数元素的count(默认0)
-
那么可以定义一个当前多数元素变量majorityElement表示当前的多数元素(默认数组第一个元素)
-
遍历数组
- 1.若count=0 将当前遍历元素代替当前多数元素
- 2.若当前遍历元素是多数元素,count++
- 3.否则count–
代码:
class Solution {
public int majorityElement(int[] nums) {
int majorityElement = nums[0];
int count = 0;
for(int i=0;i<nums.length;i++){
if(count==0) majorityElement = nums[i];
if(majorityElement == nums[i]) count++;
else
count--;
}
return majorityElement;
}
}
- 发现优化后,查找多数元素的效率提高了不少