您的位置:首页 > Web前端

【Golang】LeetCode-剑指Offer-面试题39-数组中出现次数超过一半的数字【三种解法】

2020-03-05 01:27 537 查看

题目

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof

解法一:排序查找

解题思路

  • 数组排序之后,因为数字出现次数超过一半,肯定就是在中间位置,直接返回即可。

代码

----执行时间:24 ms --消耗内存:5.9 MB

func majorityElement(nums []int) int {
sort.Ints(nums)
return nums[len(nums)/2]
}

解法二:哈希表计数

解题思路

  • 建立哈希表map[int]int , key为数字,value为出现次数
  • 遍历数组,使用哈希表统计数字和其出现次数
  • 遍历哈希表,返回出现次数超过长度一半的数字

代码

–执行时间:24 ms --消耗内存:5.9 MB

func majorityElement(nums []int) int {
hashmap:=make(map[int]int)
for _,n:=range nums{
count:=hashmap[n]
if count==0{
hashmap[n]=1
}else{
hashmap[n]=hashmap[n]+1
}
}
for k,v:=range hashmap{
if v>len(nums)/2{
return k
}
}
return 0
}

解法三:模拟投票

解题思路

  • 根据题目可知,只有 1 个数字的出现次数超过数组长度的一半。
  • 即这个数字的出现总次数比其他数字的出现次数的和还要多。

定义变量 该数字 result 和 出现总数 count。

  • 第一次遍历原数组的时候,count = 0,那么 result 等于当前元素
  • count != 0 且 result !=当前元素,count 减 1
  • count != 0 且 result = 当前元素,count 加 1
  • 遍历完成后,result 的值就是数组中出现次数超过一半的数字了。

该解题思路引用自作者:xin-tan

代码

–执行时间:16 ms --消耗内存:5.9 MB

func majorityElement(nums []int) int {
var ret int
count:=0
for i:=0;i<len(nums);i++{
if count==0{
ret=nums[i]
}
if ret==nums[i]{
count++
}else{
count--
}
if count>len(nums)/2{
break
}
}
return ret
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
士多啤梨先生 发布了57 篇原创文章 · 获赞 0 · 访问量 963 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: