LeetCode-169 求众数(六种解法)

问题:

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

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

示例 1:

输入: [3,2,3]
输出: 3
示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

六种解法的思路

最差方法:穷举

利用查找的思想:hashmap

利用数学特性:在下标为n/2的位置的数一定是众数,所以先排序,排完以后直接取出众数。

不靠谱的解法(数学概率):随机法。因为超过一半的下标被众数占据,所以随机找出一个数检验是否是众数。时间复杂度可能为无穷大。

分治(不会,待补充):

投票选举法:假设众数是1,其他数是-1,则所有相加必然大于1。使用一个计数器,和候选数来解决,第一个数默认是候选数,遍历整个数组,当下一个数不等于候选数,则计数器减1,等于侯选数则加1,当计数器为零,则要遍历的下一个数是候选数,遍历完整个数组,候选数就是众数。

代码:

hashmap的解法

class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> arrayMap = new HashMap<Integer,Integer>();
int temp;
for(int i=0;i<nums.length;i++){
if(arrayMap.containsKey(nums[i])){
temp = arrayMap.get(nums[i]);
if(temp+1>nums.length/2){
return nums[i];
}
arrayMap.put(nums[i],temp+1);
}else
{
arrayMap.put(nums[i],1);
}
}
return nums[0];
}
}

猜你喜欢

转载自www.cnblogs.com/gmzqjn/p/11697712.html