剑指offer-28-数组中出现次数超过一半的数字

数组中出现次数超过一半的数字_牛客网

https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:用一般的排序也可以完成这道题目,但是如果那样完成的话就可能太简单了。
用preValue记录上一次访问的值,count表明当前值出现的次数,如果下一个值和当前值相同那么count++;如果不同count--,减到0的时候就要更换新的preValue值了,因为如果存在超过数组长度一半的值,那么最后preValue一定会是该值。

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length == 0)return 0;
        int preV

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白刷剑指offer 文章被收录于专栏

跟着小白一起刷剑指offer,通过讨论加深印象吧~ 没有人不学习就能够掌握知识,知识就是需要学习的~

全部评论
赞,同归于尽的做法,反正是大于一半,一一抵消肯定还会剩的
4 回复 分享
发布于 2020-03-02 18:54
为我的智商捉急
2 回复 分享
发布于 2020-04-04 11:42
思路非常不错,基于你的思路最后一步还可以简化一下,代码如下: public int MoreThanHalfNum_Solution(int [] array) { if (array == null || array.length == 0) { return 0; } int pre = array[0]; int count = 1; int c = 0; for (int i = 1; i < array.length; i++) { if (array[i] != pre) { count--; if (count == 0) { pre = array[i]; count = 1; c++; } } else { count++; } } if (c <= array.length / 2) { return pre; } return 0; }
2 回复 分享
发布于 2020-02-19 18:25
您好,遍历结束后,都已经知道了preValue出现的次数是count,而且也是最多的,直接判断 return count > array.length/2 ? preValue : 0;为什么不行啊
1 回复 分享
发布于 2020-09-15 10:04
摩尔投票法
点赞 回复 分享
发布于 2021-05-31 14:57
很难理解
点赞 回复 分享
发布于 2021-05-17 06:05
妙哉妙哉
点赞 回复 分享
发布于 2021-02-21 23:49
第一次遍历结束后,count不是preValue出现的次数
点赞 回复 分享
发布于 2020-11-06 17:44
妙啊
点赞 回复 分享
发布于 2020-05-27 18:44
楼主好厉害!这些思路你都是怎么想出来的!感觉楼主你擅长突破思维定式,佩服佩服!
点赞 回复 分享
发布于 2020-04-26 14:28
思路很好但有两个小问题:第一,如果第一个for循环里得出count>length/2,那中间就可以直接返回了吧?比如恰好前n个数都是超过一半的数;第二,类似的,恰好后n个数都是超过一半的数,那第二个for循环也没必要执行
点赞 回复 分享
发布于 2020-04-20 00:08
最后return时 应该是return (num >= array.length/2)?preValue:0;
点赞 回复 分享
发布于 2020-04-13 11:00
点赞 回复 分享
发布于 2020-03-24 20:57
很巧妙
点赞 回复 分享
发布于 2020-03-22 00:02
强者啊
点赞 回复 分享
发布于 2020-03-21 15:08
为什么是同归于尽呢有点不懂求解
点赞 回复 分享
发布于 2020-03-08 15:20
牛逼,想了一会儿才想明白
点赞 回复 分享
发布于 2020-01-12 21:48
思路很巧妙 ,就是int preValue = 1;这里打错啦,应该是count
点赞 回复 分享
发布于 2019-09-14 11:08

相关推荐

评论
84
6
分享

创作者周榜

更多
牛客网
牛客企业服务