題目:
數(shù)組中有一個數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請找出這個數(shù)字。例如輸入一個長度為9的數(shù)組{1,2,3,2,2,2,5,4,2}。由于數(shù)字2在數(shù)組中出現(xiàn)了5次,超過數(shù)組長度的一半,因此輸出2。如果不存在則輸出0。
思路:
思路1: 可以做排序,如數(shù)組符合條件,處于中間的那個數(shù)必定是所求數(shù),然后統(tǒng)計出現(xiàn)個數(shù),判斷是否符合題意。因快排時間復雜度O(nlogn),并非最優(yōu)
思路2:如果有符合條件的數(shù)字,則它出現(xiàn)的次數(shù)比其他所有數(shù)字出現(xiàn)的次數(shù)和還要多。
在遍歷數(shù)組時保存兩個值:一是數(shù)組中的一個數(shù)字,一個是次數(shù)。遍歷下一個數(shù)字時,若它與之前保存的數(shù)字相同,則次數(shù)加1,否則次數(shù)減1;若次數(shù)為0,則保存下一個數(shù)字,并將次數(shù)置為1。遍歷結束后,所保存的數(shù)字即為所求。然后再判斷它是否符合條件即可。
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 count = 1;
for(int i = 1;i < length; i++){
if(count == 0){
result = array[i];
count = 1;
}else{
if(array[i] == result){
count++;
}else{
count--;
}
}
}
int times=0;
for(int i = 0;i < length; i++){
if(result == array[i]){
times++;
}
}
if(times*2 <= length){
result = 0;
}
return result;
}
}