一開始 老不對老不對,我以為是 把vevtor 換成陣列就對了 我以為是這個問題呢 其實不是
原因竟然是 end=index-1; 這裡要拿出來才行 不然就是不對 注意吧
classsolution
else
}int result=numbers[middle];
//接下來要判斷是否 這個數字沒有滿足大於陣列一半的要求
int num=0
;
for(int i=0;i)
if(num>length/2
)
return
result;
else
return0;
}public
:
int partition(vector & numbers,int low,int
high)
swap(numbers[low],numbers[high]);
while(lowpivotkey)
swap(numbers[low],numbers[high]);
}return
low;
}public
:
void swap(int &a,int &b)
};
思路二:如果有符合條件的數字,則它出現的次數比其他所有數字出現的次數和還要多。
在遍歷陣列時儲存兩個值:一是陣列中乙個數字,一是次數。遍歷下乙個數字時,若它與之前儲存的數字相同,則次數加1,否則次數減1;若次數為0,則儲存下乙個數字,並將次數置為1。遍歷結束後,所儲存的數字即為所求。然後再判斷它是否符合條件即可。
通俗易懂的說法:
採用陣地攻守的思想:
第乙個數字作為第乙個士兵,守陣地;count = 1;
遇到相同元素,count++;
遇到不相同元素,即為敵人,同歸於盡,count--;當遇到count為0的情況,又以新的i值作為守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,有可能是主元素。
再加一次迴圈,記錄這個士兵的個數看是否大於陣列一般即可。
//********************方法2********************
//這個比較複雜,就是下一值如果和當前值一致,count就+1,否則-1,如果為0,則捨棄記錄當前值,改下一值,最後+1的值可能會超過一半
int morethanhalfnum_solution2(int* numbers, int
length)
else
if (numbers[i] ==result)
times++;
else
times--;
}if (!checkmorethanhalf(numbers, length, result))
result = 0
;
return
result;
}
陣列中數字超過一半的數字
題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。1,利用hashmap 2,利用陣列排序 3,列舉法 暴力演算法 public class 陣列中數字超過一半的數字 e...
陣列中超過一半的數字
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。思路 定義乙個變數儲存當前元素,乙個計數器儲存次數,若次數等於0,則重新取字元。若次數大於零,遇到相同字元計數器 1,不同字元計...
出現次數超過陣列長度一半的數字
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列,由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。hashmap 法 此法思路簡單,可以使用hashmap 記錄當前的數字和他出現的次數 但是重點在於 遍歷整個map,找到符合條件的值 2。消去法 既...