劍指offer---數組中出現次數超過一半的數字
阿新 • • 發佈:2017-08-04
不同的 div 基礎 還要 否則 ret break temp tor
(註意到目標數 超過數組長度的一半,對數組同時去掉兩個不同的數字,到最後剩下的一個數就是該數字。如果剩下兩個,那麽這兩個也是一樣的,就是結果),在其基礎上把最後剩下的一個數字或者兩個回到原來數組中,將數組遍歷一遍統計一下數字出現次數進行最終判斷。 public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int length=array.length; if(array==null||length<=0){ return0; } 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---數組中出現次數超過一半的數字