陣列中出現次數超過一半的數字

2021-08-21 12:43:30 字數 1848 閱讀 1336

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

定義乙個關聯容器map,將元素依次塞入map中,對每個元素w依次檢驗出現的個數,w.first為元素值,w.second為對應元素個數,如果個數大於長度的一半,就返回

class solution 

return

0; }

};

對所有的元素進行排序,將所有元素遍歷一遍,計算每種元素的個數,若當前元素的個數大於前面的統計結果,將結果重新整理

class solution 

num = 0; //重置計數器}}

if (resultnum + 1 > len / 2) //resultnum計算結果為對應元素個數減1

return result;

return

0; }

};

當然也可以用for迴圈代替while迴圈

class solution 

num = 0;}}

if (resultnum + 1 > len / 2) //resultnum計算結果為對應元素個數減1

return result;

return

0; }

};

對於vector的操作,不僅可以解引用迭代器來獲取元素,也可以通過下表來獲取元素,如vector型別的變數numbers,numbers[0]表示第乙個元素,下標從0開始;

對所有元素進行排序,則相等的元素將會在相鄰的位置。設定乙個臨時量等於每一種元素的第乙個元素,迴圈統計這種元素的個數;若後面有數量更大的元素,重新整理這個記錄,統計出最大個數的元素,如果數量大於總長度的一般,返回這個元素

class solution 

num=1;

tmp=numbers[i];}}

if(resultnum>len/2)

return result;

return

0; }

};

陣列排序後,如果符合條件的數存在,則一定是陣列中間那個數。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等)

class solution 

if(count>len/2)

return middle;

return

0; }

};

時間複雜度分析:涉及到快排sort,時間複雜度為o(nlogn);

採用使用者「分形葉」思路(注意到目標數超過陣列長度的一半,陣列同時去掉兩個不同的數字,到最後剩下的就是目標數),如果沒有超過陣列長度的一半的目標數,則剩下某乙個,所以最後要統計剩下的這個數的個數,大於陣列長度一半,則返回該數,不大於,返回0。

class solution 

else

if (tmp==numbers[i])

count++;

else

count--;

}int result=tmp;

int num=0;

for (int i = 0; i < len; i++)

if(result==numbers[i])

num++;

if(num>len/2)

return result;

return

0; }

};

時間複雜度分析:o(n)

陣列中出現次數超過一半的數字

何海濤 劍指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 ...

陣列中出現次數超過一半的數字

題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。解題思路 將陣列按大小排序,若存在數字出現次數超過陣列長度的一般,則陣列中位數必定為該數字 1 將陣列排序完成後,取a...