我是靠谱客的博主 懦弱书包,最近开发中收集的这篇文章主要介绍剑指offer算法题:数组中出现次数超过一半的数字MoreThanHalfNum_Solution,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:将数组中元素传入hashmap中。
public static int MoreThanHalfNum_Solution(int [] array) {
int length = array.length;
if(length < 2)
return length == 1 ? 1 : 0;
int target = length >> 1;
HashMap<Integer,Integer> map = new HashMap<>();
for(int num : array){
if(map.containsKey(num)){
int cur = map.get(num) + 1;
if(cur > target)
return num;
map.put(num,cur);
}else{
map.put(num,1);
}
}
return 0;
}
按照数组特点在O(n)的时间复杂度下寻找
public int MoreThanHalfNum_Solution(int [] array) {
int length;
if(array == null || (length = array.length) == 0)return 0;
int cur_num = array[0];
int times = 1;
for(int i = 1;i < length;i++) {
if(times == 0) {
cur_num = array[i];
times = 1;
}else if(cur_num == array[i])
times++;
else
times--;
}
return checkMoreThanHalf(array,cur_num) ? cur_num : 0;
}
private boolean checkMoreThanHalf(int[] numbers,int number) {
int sum = 0;
for(int i = 0;i < numbers.length;i++) {
if(number == numbers[i])sum++;
}
return sum << 1 <= numbers.length ? false : true;
}
最后
以上就是懦弱书包为你收集整理的剑指offer算法题:数组中出现次数超过一半的数字MoreThanHalfNum_Solution的全部内容,希望文章能够帮你解决剑指offer算法题:数组中出现次数超过一半的数字MoreThanHalfNum_Solution所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复