題目描述
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為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...