數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。

//方案一java

import java.util.*;code

public class Solution {get

public int MoreThanHalfNum_Solution(int [] array) {
     
    int len=array.length;
      HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
      
    for(int i=0;i<len;i++){
       
          if(!hash.containsKey(array[i]))
             hash.put(array[i],1);
         else 
             hash.put(array[i], hash.get(array[i]) + 1);
        
        if(hash.get(array[i])*2>len)
            return array[i];
    }

    return 0;
}

}input

//方案二 網友稱爲分形葉的思想hash

import java.util.*;io

public class Solution { public int MoreThanHalfNum_Solution(int [] array) {class

int len=array.length;
     
     int result = array[0];
     int time=1;
    
     for(int i=1;i<len;i++)
     {
         if(time==0){
             time=1;
             result=array[i];
         }else
             if(result==array[i])
                 time++;
             else
                 time--; 
     }
    
    int sum=0;
    for(int i=0;i<len;i++)
        if(array[i]==result)
            sum++;
    
    
    if(sum*2>len)
        return result;
    else
        return 0;
    
}

}import

//方案三:im

import java.util.*;while

public class Solution {

public int MoreThanHalfNum_Solution(int [] array) {
     
    int len=array.length;
     
    int mid=len/2;
    
    int start=0;
    int end=len-1;
    int index = f(array,start,end);
    
    while(index!=mid){
        if(index>mid)
            index=f(array,start,index-1);
        else
            index=f(array,index+1,end);
    }
    
    
    int result=array[mid];
    int sum=0;
    
    for(int i=0;i<len;i++)
        if(result==array[i])
            sum++;
    
    return sum*2>len?result:0;
    
    
  
    
}

public int f(int input[],int begin,int end){

   int low = begin;
   int high = end;
   int pivot = input[low];
   while (low < high)
    {
      while (low < high&&pivot <= input[high])
         high--;
       
      input[low] = input[high]; 
      while (low < high&&pivot >= input[low])
         low++;
      input[high] = input[low]; 
    }
      input[low] = pivot;
      return low;
    
}

}

推薦方案二,方案其實不好,可是提供了一個球第k大數的思路

相關文章
相關標籤/搜索