陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。關注題目,陣列中有乙個數字出現的次數超過陣列長度的一半。記陣列長度為le例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。
如果不存在則輸出0。
n len
。如果這個數字存在,記其出現次數為
t t
,剩下的數字出現的次數為le
n−t' role="presentation" style="position: relative;">len
−tle
n−t。
t−(l
en−t
)=2∗
t−le
n>
0 t−(
len−
t)=2
∗t−l
en
>
0所以如果假定這個數存在,記為x x
,當遍歷陣列,遇到與
x' role="presentation" style="position: relative;">x
x不相同的數字出現次數就-1,那麼最後結果也一定是大於0的。
基於這個結論,我們得出了下面的方法:
將陣列第乙個數字儲存起來,記錄其出現次數count = 1;遇到相同元素,++count;遇到不相同元素則–count;
顯然,如果count為0,則當前值可能大概率不是
x x
,將此時新的元素儲存起來,重複上述過程;
上述假想只是必要條件而非充分條件,因此需要再次遍歷一次,看看這個值是否滿足出現的次數超過陣列長度的一半。
**如下
int morethanhalfnum_solution(vector
numbers) }}
int time = 0;
for(int i=0;iif(numbers[i] == num_temp)
++time;
}if(time > numbers.size()/2)
return num_temp;
else
return
0; }
從定義出發,就看每個元素出現的次數有多少。這個時間複雜度是很低的,但是空間複雜度是比較高的,因為類似桶排序,需要預先分配各個元素的記憶體。
用map或者自己建的桶。
由於出現次數超過一半,如果是排好序的話,那麼一定出現在中間以後的位置。使用快排再查詢可以實現。
陣列中出現超過一半的次數
題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0.思路一 把陣列排好序,出現次數超過一半的數一定是排好序陣列的中位數。然後取中位數,計算它出現的次數是否超過陣列長度的一半。...
陣列中出現次數超過一半的數字
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。輸入 每個測試案例包括2行 第一行輸入乙個整數n 1 n 100000 表...
陣列中出現次數超過一半的數字
陣列中出現次數超過一半的數字 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。class solution count 0 for auto i numbers if i k ...