题目详情
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.You may assume that the array is non-empty and the majority element always exist in the array.输入一个大小为n的数组,整个数组里面将会含有一个众数,即这个元素出现的次数大于n/2,我们需要找到并返回这个众数
思路
- 这道题也是一道关于数组的重复元素的问题
- 首先我想到的办法是,使用HashMap实现,key是元素的值,value则是这个元素在当前出现的次数,一旦这个次数大于n/2,我们就可以停止我们的遍历
- 但实际上,还有一种更简单的方法。因为众数出现的次数必定大于n/2,所以我们只要取第n/2个位置上的元素,这个元素一定为我们要找的众数。
- 感谢@SegmentWarrior提供的解法三,不需要建立hashmap所产生的额外空间,同时时间复杂度为O(n)
解法一 HashMap
//HashMap实现 时间复杂度O(n)
public int majorityElement(int[] nums) {
HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
int length = nums.length;
if(length<=1){
return nums[0];
}
for(int i=0;i<length;i++){
if(count.get(nums[i]) != null){
int temp = count.get(nums[i]);
count.put(nums[i],temp+1);
if(temp+1 > length/2){
return nums[i];
}
}else{
count.put(nums[i], 1);
}
}
return -1;
}
解法二 直接取n/2位置元素
//思想:对于一个排序好的数组,第n/2的位置的元素一定是存在的这个众数
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
解法三 对出现次数计数
public int majorityElement(int[] nums) {
int res = nums[0];
int count = 1;
for(int i=1;i<nums.length;i++){
if(nums[i] == res) count ++;
else if(count >1) count --;
else res = nums[i];
}
return res;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。