#include#includevoid swap(int* data1,int* data2)
int partition(int data,int length,int start,int end)//基於partition函式的o(n)演算法
else
}int result=numbers[middle];
if(!checkmorethanhalf(numbers,length,result))
result=0;
return result;}*/
int morethanhalfnum(int* numbers,int length)
{ if(checkinvalidarray(numbers,length))
return 0;
int result=numbers[0];
int times=1;
for(int i=1;i
題目:陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字
分析:看到這道題,我們馬上就會想到,要是這個陣列是排序的陣列就好了。如果是排序的陣列,
那麼我們只要遍歷一次就可以統計出每個數字出現的次數,這樣也就能找出符合要求的數字了。
題目給出的陣列沒有說是排好序的,因此我們需要給它排序。排序的時間複雜度是o(nlogn),
再加上遍歷的時間複雜度o(n),因此總的複雜度是o(nlogn)。
接下來我們試著看看能不能想出更快的演算法。前面思路的時間主要是花在排序上。
我們可以建立乙個雜湊表來消除排序的時間。雜湊表的鍵值(key)為陣列中的數字,值(value)為該數字對應的次數。
有了這個輔助的雜湊表之後,我們只需要遍歷陣列中的每個數字,找到它在雜湊表中對應的位置並增加它出現的次數。
這種雜湊表的方法在陣列的所有數字都在乙個比較窄的範圍內的時候很有效。
前面兩種思路都沒有考慮到題目中陣列的特性:
陣列中有個數字出現的次數超過了陣列長度的一半。也就是說,有個數字出現的次數比其他所有數字出現次數的和還要多。
因此我們可以考慮在遍歷陣列的時候儲存兩個值:乙個是陣列中的乙個數字,乙個是次數。當我們遍歷到下乙個數字的時候,
如果下乙個數字和我們之前儲存的數字相同,則次數加1。如果下乙個數字和我們之前儲存的數字不同,則次數減1。
如果次數為零,我們需要儲存下乙個數字,並把次數設為1。由於我們要找的數字出現的次數比其他所有數字出現的次數之和還要多,
那麼要找的數字肯定是最後一次把次數設為1時對應的數字。
結果:
陣列中數字超過一半的數字
題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。1,利用hashmap 2,利用陣列排序 3,列舉法 暴力演算法 public class 陣列中數字超過一半的數字 e...
陣列中超過一半的數字
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。思路 定義乙個變數儲存當前元素,乙個計數器儲存次數,若次數等於0,則重新取字元。若次數大於零,遇到相同字元計數器 1,不同字元計...
陣列中超過一半的數字 js
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。第一種是新建乙個空物件來儲存陣列中數字出現的次數 遍歷該,如果該數字出現過,則obj中以該數字為key的value加1 若該數字未...