69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
|
|
/*
|
|||
|
|
* @Author : huangzj
|
|||
|
|
* @Time : 2021/3/16 16:46
|
|||
|
|
* @Description:
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
package NumberMoreThan
|
|||
|
|
|
|||
|
|
type NumberMoreThanKObj struct{}
|
|||
|
|
|
|||
|
|
func (*NumberMoreThanKObj) Doc() string {
|
|||
|
|
return `
|
|||
|
|
给定一个整型数组arr(数组长度为N) 与一个整数k,打印所有出现次数大于 N/K 的数。如果没有这样的数,返回-1。
|
|||
|
|
|
|||
|
|
要求:时间复杂度为O(N*K),额外空间复杂度为O(K)。
|
|||
|
|
`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func NumberMoreThanK(numList []int, k int) []int {
|
|||
|
|
//小于2的情况是肯定不会超过.
|
|||
|
|
if k < 2 {
|
|||
|
|
return []int{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//用来保存数字与其出现次数
|
|||
|
|
numMap := make(map[int]int, 0)
|
|||
|
|
for _, num := range numList {
|
|||
|
|
//如果不存在则数值设置为1
|
|||
|
|
if _, ok := numMap[num]; !ok {
|
|||
|
|
numMap[num] = 1
|
|||
|
|
} else {
|
|||
|
|
//存在则出现次数+1
|
|||
|
|
numMap[num] = numMap[num] + 1
|
|||
|
|
}
|
|||
|
|
//当容器的大小为k
|
|||
|
|
if len(numMap) == k {
|
|||
|
|
for key, value := range numMap {
|
|||
|
|
//个数正好等于1的要删掉,因为本次减一之后,就等于0了
|
|||
|
|
if value == 1 {
|
|||
|
|
delete(numMap, key)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//map的key是可能出现次数超过N/k的数
|
|||
|
|
//这里主要是为了拿到key
|
|||
|
|
for key := range numMap {
|
|||
|
|
numMap[key] = 0
|
|||
|
|
}
|
|||
|
|
//重新计算对应数字的出现次数
|
|||
|
|
for _, num := range numList {
|
|||
|
|
if _, ok := numMap[num]; ok {
|
|||
|
|
numMap[num]++
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//出现次数超过k次的判断
|
|||
|
|
result := make([]int, 0)
|
|||
|
|
for key, value := range numMap {
|
|||
|
|
if value > len(numList)/k {
|
|||
|
|
result = append(result, key)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return result
|
|||
|
|
}
|