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

2021-09-13 14:53:42 字數 2054 閱讀 8453

題目描述

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

方法一 ---- 基於隨機快排

如果陣列中存在乙個數字的出現次數大於陣列長度一半,那麼將這個陣列排序後位於該陣列的中位數就是這個數字。

在隨機快速排序中,現在陣列中隨機選擇乙個數字,然後調整陣列中的數字的順序,使得比選中的數字小的的數字都在它的左邊,比他大的數字都在其右邊。如果這個選中的數字的下標剛好是n/2,那麼這個數字就是陣列的中位數;如果這個下標大於n/2,那麼中位數應該在它的左邊,我們可以接著在它左邊部分的陣列中查詢;如果這個下標小於n/2,那麼表示中位數在它的右邊,在右邊的陣列中查詢。是乙個典型的遞迴過程。

/**

* 利用partition函式的時間複雜度為o(n)的演算法

* @param array

* @return

*/public

intmorethanhalfnum_solution

(int

array)

if(array.length ==1)

int middle = array.length /2;

int start =0;

int end = array.length -1;

int index =

partition

(array, start, end)

;while

(index != middle)

else

}int result = array[middle];if

(!checkmorethanhalf

(array, result)

)return result;

}public

boolean

checkmorethanhalf

(int

elem,

int result)}if

(times *

2<= elem.length)

return ismorethanhalf;

}public

intpartition

(int

elem,

int low,

int high)

swap

(elem, low, high)

;while

((low < high)

&& elem[low]

<= pivotkey)

swap

(elem, low, high);}

return low;

}public

void

swap

(int

elem,

int i,

int j)

方法二 ---- 根據陣列特點

如果有乙個數字在陣列**現次數大於陣列的一半,那麼也就是說他出現的次數比其他數字出現次數和還要多。我們可以設定兩個變數,乙個儲存陣列中的乙個數字,另外乙個儲存次數,遍歷陣列,當遍歷到下乙個數字時,如果下乙個數字和之前儲存的數字相同,次數加1;如果不同次數減1;如果次數為0,那麼我們需要儲存下乙個數字,並將次數還原為1。

/**

* 根據陣列特點找出時間複雜度為o(n)的演算法

* @param args

*/public

intmorethanhalfnum_solution_2

(int

array)

if(array.length ==1)

int tempnumber = array[0]

;int times =1;

for(

int i =

1; i < array.length; i++

)else}}

if(!checkmorethanhalf

(array, tempnumber)

)return tempnumber;

}

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

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