快排裡面的partition,遞迴找到中間元素,使得左邊元素小於或等於中間元素,右邊元素大於或等於中間元素。時間複雜度為o(n),空間複雜度為o(n),原來元素的順序被打亂了。
hashmap,將陣列元素建立hashmap,key為陣列元素的值,value為元素出現頻次,找到頻次出現超過半數的key,複雜度和上述一樣
上面兩種方法計算複雜度為o(n),但空間複雜度為o(n),不是最優解,下面的方法空間複雜度為o(1):
用兩個臨時變數,乙個儲存陣列元素,乙個記錄出現頻次。
遍歷陣列,如果當前元素和臨時元素相等,頻次加一;
否則減一,如果頻次小於1,則臨時元素變為當前元素,出現頻次變為1。
分析:如果乙個數出現頻次大於半數,那麼它出現的頻次必然大於其他所有元素出現的頻次,一次遍歷後,臨時元素儲存的肯定是頻次超過一半的元素。
**如下:
//
// main.cpp
// morethanhalf
//// created by lilingyu on 15/10/20.
//#include /*
已知有陣列裡面有個元素出現次數超過一半,問如何找出這個數,時間複雜度o(n),空間複雜度o(1)
常見的hashmap時間複雜度為o(n),空間複雜度為o(n),不是最優選
*/bool ismorethanhalf(int* a, int
len, int number)}}
return
false;
}int morethanhalf(int* a, int
len)
else}}
/*if (counter>=0)
else*/
if (ismorethanhalf(a, len, tmp))
else
}int main(int argc, const char * argv) ;
for (int i=0; iprintf("\n");
printf("result: \n");
printf("%d\n", morethanhalf(a, len));
return
0;}
求陣列中出現次數超過一半的元素
如果可以排序,就先排序,找n 2位置的元素,如果有,那麼這個元素就是,但也有可能沒有,所以要再檢查一遍,該方法的時間複雜度為o nlogn 另外一種方法就是用乙個棧來實現,對於當前元素,若棧空,則入棧,若棧不為空,與棧頂元素比較,相等則入棧,不等則彈出棧頂元素。如果有主元素,最後的棧頂一定是主元素。...
獲取陣列中出現次數超過一半的元素
根據陣列特點找出o n 的演算法 1.陣列中有乙個數字出現的次數超過陣列長度的一半,也就是說它出現的次數比其他所有的數字出現的次數的和還要多。2.因此我們可以考慮在遍歷陣列的時候儲存兩個值 乙個是陣列中的乙個數字,乙個是次數。3.當我們遍歷到下乙個數字的時候,如果下乙個數字和我們之前儲存的數字相同,...
陣列中超過一半的數字
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。思路 定義乙個變數儲存當前元素,乙個計數器儲存次數,若次數等於0,則重新取字元。若次數大於零,遇到相同字元計數器 1,不同字元計...