【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 }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 牛客剑指Offer面试题39:数组中出现次数超过一半的数字
- 【剑指offer】面试题39:数组中出现次数超过一半的数字
- 【剑指offer】面试题39 数组中出现次数超过一半的数字
- 【剑指offer】面试题 39:数组中出现次数超过一半的数字
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
- 剑指Offer-39 数组中出现次数超过一半的数字
- 剑指offer--面试题29:数组中出现次数超过一半的数字
- 剑指offer-面试题29.数组中出现次数超过一半的数字
- 剑指Offer面试题29数组中出现次数超过一半的数字(涉及快排)
- 【剑指Offer学习】【面试题29 :数组中出现次数超过一半的数字】
- 剑指offer面试题[29]-数组中出现次数超过一半的数字
- 【剑指offer】面试题29:数组中出现次数超过一半的数字
- 【面试题】剑指offer29--数组中出现次数超过一半的数字
- 剑指offer面试题29:数组中出现次数超过一半的数字
- 剑指Offer-39:数组中出现次数超过一半的数字
- 剑指offer 面试题29—数组中出现次数超过一半的数字
- 剑指offer面试题29-数组中出现次数超过一半的数字
- 剑指offer之面试题29:数组中出现次数超过一半的数字
- 剑指offer 面试题29 数组中出现次数超过一半的数字
- 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)