题目:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
众数的计算方法:(一)、根据单项数列求众数,不需要任何计算,可以直接从分配数列中找出出现次数或频率最大的一组标志值,就是所求的众数。(二)、对组距数列求众数。对众数的计算有两种公式:1、上限公式:2、下限公式。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
解题思路:记录每个数出现的次数,找出大于n/2的数,使用map存储
func majorityElement(nums []int) int {
length:=len(nums)
mapX:=make(map[int]int)
for i:=0;i<length;i++{
mapX[nums[i]]++
}
还可以用皮尔逊经验法:根据计算公式:MO=ξ-3(ξ-Md)可求众数。式中ξ为样本均值,Md为中数,用皮尔逊公司计算所得众数近似于理论众数,常称为皮尔逊近似众数。众数是皮尔逊(Pearson,K.)最先提出并在生物统计学中使用。
key:=length/2
for k,v:=range mapX{
if v>key{
return k
}
}
return -1
}
执行用时20ms
思路二:如果不用map,可以先排序,然后取中间值
func majorityElement(nums []int) int {
sort.Ints(nums)
return nums[len(nums)/2]
}
执行用时24ms
优化:搜索到大神的代码,很巧妙的一遍循环搞定,看起来效率杠杠的:
func majorityElement(nums []int) int {
tmp:=nums[0]//记录值
count:=0//计次数
用观察法可以求得众数。若数据已归类,则出现频数最多的数据即为众数;若数据已分组,则频数最多的那一组的组中值即为众数。一般来说,一组数据中,出现次数最多的数就叫这组数据的众数。如果有两个或两个以上个数出现。
for i:=0;i<len(nums);i++{
有两种方法:(一)、根据单项数列求众数,不需要任何计算,可以直接从分配数列中找出出现次数或频率最大的一组标志值,就是所求的众数.(二)、对组距数列求众数.对众数的计算有两种公式:1、上限公式:2、下限公式:其中:f。
if tmp==nums[i]{
count++
}else{
count--
if count==0{
tmp=nums[i]
count++
}
}
}
return tmp
}
执行时间:20ms (LeetCode的这个执行时间可能不太准!)