方法一:使用map存储每个元素出现的个数
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] arr) {
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<arr.length;i++){
if(map.get(arr[i])!=null){
map.put(arr[i],map.get(arr[i])+1);
if(map.get(arr[i])>arr.length/2){
return arr[i];
}
}else{
if(arr.length==1) return arr[0];
map.put(arr[i],1);
}
}
return 0;
}
}
方法二:把数组排序,要返回的结果必然在中间,若中间是两个数,则这两个数必然相等
import java.util.Arrays;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
Arrays.sort(array);
int count=0;
for(int i=0;i<array.length;i++){
if(array[i]==array[array.length/2]){
count++;
}
}
if(count>array.length/2){
return array[array.length/2];
}else{
return 0;
}
}
}
方法三:分叶法,坚守阵地法
分析:第一个数字作为士兵,count=1,遇到一个相等的数字即友军则count++,遇到不同的数字即敌军则count--,当count==0的时候,选用下一个数字作为友军count=1。直到最后若count >1,那么只有这个数字才有可能是超过一半的数字,因为若一个数字他超过数组一半,那么它必定能活到最后。
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int length=array.length;
if(array==null||length<=0){
return 0;
}
int result=array[0];
int times=1;
for(int i=1;i<length;i++){
if(times==0){
result=array[i];
times=1;
}else{
if(array[i]==result){
times++;
}else{
times--;
}
}
}
times=0;
for(int i=0;i<length;i++){
if(result==array[i]){
times++;
}
}
if (times * 2 >length) {
return result;
}
return 0;
}
}