清奇思路(五) 陣列中出現次數超過1半的次數

2021-08-19 14:35:58 字數 1353 閱讀 7464

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。

例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。

如果不存在則輸出0。

關注題目,陣列中有乙個數字出現的次數超過陣列長度的一半。記陣列長度為le

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 ...