29 输出超过一半的数

//输出超过一半的数,如果没有则输出-1。通过编译,bymyself
import java.util.*;
public class MoreThanHalf{
    public static void main(String args[]){
        int array[]={3,4,5,3,2,3};
        System.out.println(moreThanHalf(array));
    }
    public static int moreThanHalf(int[] array){
        Arrays.sort(array);
        Set sets = new TreeSet();
        List lists = new ArrayList();
        for(int i=0; i<array.length; i++){
            sets.add(String.valueOf(array[i]));//String.valueOf!!!
            lists.add(String.valueOf(array[i]));
        }
        //转为字符串,才能使用indexOf
        StringBuffer sb = new StringBuffer();
        Iterator it = lists.iterator();
        while(it.hasNext()){
            String s = (String)it.next();
            sb.append(s);        
        }
        String ss=sb.toString();
        //
        it = sets.iterator();
        while(it.hasNext()){
            String s = (String)it.next();
            int start = ss.indexOf(s);
            int end = ss.lastIndexOf(s);
            if(end-start+1>array.length/2){
                return Integer.parseInt(s);
            }
        }
        return -1;
    }
}

    
//输出超过一半的数,如果没有则输出-1。通过测试
import java.util.*;
public class MoreThanHalf1{
    public static void main(String args[]){
        int array[]={3,4,5,3,2,3};
        System.out.println(moreThanHalf(array));
    }
    public static int moreThanHalf(int[] array){
        if(array.length==1){//当数组中只有一个数时,要输出该数
            return array[0];
        }
        Arrays.sort(array);
        int count = 1;
        for(int i=0; i<array.length-1; i++){
            if(array[i]==array[i+1]){
                count++;
                if(count>array.length/2){//不是else if
                return array[i];
                }
            }else{
                count = 1;
            }
        }
        return -1;
    }
}

    
//输出超过一半的数,如果没有则输出-1。通过编译.O(n)
public class MoreThanHalf2{
    public static void main(String args[]){
        int array[]={3,4,5,3,3};
        System.out.println(moreThanHalf(array));
    }
    public static int moreThanHalf(int[] array){
        if(array==null || array.length<=0){//null必须小写
            return 0;
        }
        int middle = array.length>>1;
        int start = 0;
        int end = array.length-1;
        int index = partition(array,start,end);
        while(index!=middle){
            if(index>middle){
                end = index-1;
                index = partition(array,start,end);
            }else{
                start = index+1;
                index = partition(array,start,end);
            }
        }
        int result = array[middle];
        int times = 0;
        for(int i=0; i<array.length; i++){
            if(array[i]==result){
                times++;
            }
        }
        if(times*2<=array.length){
            return 0;
        }
        return result;
    }
    
    public static int partition(int data[],int low,int high){
        int k = data[low];
        while(low<high){
            while(low<high&&data[high]>=k){
                high--;
            }
            if(low<high){
                data[low++]=data[high];
            }
            while(low<high&&data[low]<=k){
                low++;
            }
            if(low<high){
                data[high--]=data[low];
            }
        }
        data[low]=k;
        return low;    
    }
}

    

 推荐算法:

//输出超过一半的数,如果没有则输出-1。通过测试O(N)
import java.util.*;
public class test29{
  public static void main(String args[]){
      int array[]={3};
      System.out.println(moreThanHalf(array));
  }
  public static int moreThanHalf(int[] array){
      int result = -1;
      int times = 0;
      for(int i=0;i<array.length;i++){
          if(times==0){
              result = array[i];
              times=1;
          }else if(result==array[i]){
              times++;
          }else{
              times--;
          }
      }
      //判断result是否超过一半
      times=0;
      for(int i=0;i<array.length;i++){
          if(array[i]==result){
              times++;
          }
      }
      if(times>array.length>>1){
          return result;
      }else{
          return -1;
      }
  }
}
原文地址:https://www.cnblogs.com/seven7seven/p/3777242.html