您现在的位置是:首页 > 文章详情

[剑指offer] 数组中出现次数超过一半的数字

日期:2018-07-10点击:300

本文首发于我的个人博客:尾尾部落

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

解题思路

三种解法:

  • 法1:借助hashmap存储数组中每个数出现的次数,最后看是否有数字出现次数超过数组长度的一半;
  • 法2:排序。数组排序后,如果某个数字出现次数超过数组的长度的一半,则一定会数组中间的位置。所以我们取出排序后中间位置的数,统计一下它的出现次数是否大于数组长度的一半;
  • 法3:某个数字出现的次数大于数组长度的一半,意思就是它出现的次数比其他所有数字出现的次数和还要多。因此我们可以在遍历数组的时候记录两个值:1. 数组中的数字;2. 次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。最后再判断它是否符合条件。

参考代码

法1:

import java.util.HashMap; import java.util.Map; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); int length = array.length; for(int i=0; i<length; i++){ if(!map.containsKey(array[i])) map.put(array[i], 1); else map.put(array[i], map.get(array[i])+1); } for (Map.Entry<Integer, Integer> entry : map.entrySet()) { if(entry.getValue()*2>length) return entry.getKey(); } return 0; } } 

法2:

import java.util.Arrays; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Arrays.sort(array); int half = array.length/2; int count = 0; for(int i=0; i<array.length; i++){ if(array[i] == array[half]) count ++; } if(count > half) return array[half]; else return 0; } } 

法3:

public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int res = array[0], count = 1; for(int i=1; i<array.length; i++){ if(array[i] == res) count++; else{ count--; } if(count == 0){ res = array[i]; count = 1; } } count = 0; for(int i=0; i<array.length; i++){ if(array[i] == res) count++; } return count > array.length/2 ? res : 0; } } 
原文链接:https://yq.aliyun.com/articles/642782
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章