1. 程式人生 > >劍指offer---數組中出現次數超過一半的數字

劍指offer---數組中出現次數超過一半的數字

不同的 div 基礎 還要 否則 ret break temp tor

(註意到目標數 超過數組長度的一半,對數組同時去掉兩個不同的數字,到最後剩下的一個數就是該數字。如果剩下兩個,那麽這兩個也是一樣的,就是結果),在其基礎上把最後剩下的一個數字或者兩個回到原來數組中,將數組遍歷一遍統計一下數字出現次數進行最終判斷。
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int length=array.length;
            if(array==null||length<=0){
                return
0; } if(length==1){ return array[1]; } int[] tempArray=new int[length]; for(int i=0;i<length;i++){ tempArray[i]=array[i]; } for(int i=0;i<length;i++){
//後面需要用零來代表抹除數字,所以對0時做特殊處理 if(tempArray[i]==0){ continue; } for(int j=i+1;j<length;j++){ if(tempArray[i]!=tempArray[j]&&tempArray[j]!=0){ tempArray[i]=0;//此處用0代表抹去該數字 tempArray[j]=0
; break; } } } for(int i=0;i<length;i++){ System.out.println(tempArray[i]); } //找出未被抹去的數字 int result=0; for(int i=0;i<length;i++){ if(tempArray[i]!=0){ result=tempArray[i]; break; } } int times=0; for(int i=0;i<length;i++){ if(result==array[i]){ times++; } } if(times*2<length){ result=0; } return result; } }

方法二:

思路二:如果有符合條件的數字,則它出現的次數比其他所有數字出現的次數和還要多。 在遍歷數組時保存兩個值:一是數組中一個數字,一是次數。遍歷下一個數字時,若它與之前保存的數字相同,則次數加1,否則次數減1;若次數為0,則保存下一個數字,並將次數置為1。遍歷結束後,所保存的數字即為所求。然後再判斷它是否符合條件即可。
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
    {
        if(numbers.empty()) return 0;
         
        // 遍歷每個元素,並記錄次數;若與前一個元素相同,則次數加1,否則次數減1
        int result = numbers[0];
        int times = 1; // 次數
         
        for(int i=1;i<numbers.size();++i)
        {
            if(times == 0)
            {
                // 更新result的值為當前元素,並置次數為1
                result = numbers[i];
                times = 1;
            }
            else if(numbers[i] == result)
            {
                ++times; // 相同則加1
            }
            else
            {
                --times; // 不同則減1               
            }
        }
         
        // 判斷result是否符合條件,即出現次數大於數組長度的一半
        times = 0;
        for(int i=0;i<numbers.size();++i)
        {
            if(numbers[i] == result) ++times;
        }
         
        return (times > numbers.size()/2) ? result : 0;
    }
};

劍指offer---數組中出現次數超過一半的數字