思路1: 排序,而後掃描一遍,這樣的複雜度主要在於排序,時間複雜度爲O(n log n)數組
思路2: 能夠借用快速排序的思想,先用O(n)的時間找到n/3位置的元素,再用O(n)的時間找到2n/3位置的元素,出現次數超過n次的元素是這兩個中的一個,掃描一邊統計一下次數就完成了。spa
思路3: 每次刪掉3個不一樣的元素,保留兩個不一樣的元素以及他們出現的頻率,最後兩個元素中,頻率高的元素既是所求。下面是ocaml的代碼rest
let find lst = let rec find_int c1 v1 c2 v2 l = match l with [] -> if c1 > c2 then v1 else v2 | h::rest -> if h = v1 then find_int (c1+1) v1 c2 v2 rest else if h = v2 then find_int c1 v1 (c2+1) v2 rest else if c1 = 0 then find_int 1 h c2 v2 rest else if c2 = 0 then find_int c1 v1 1 h rest else find_int (c1-1) v1 (c2-1) v2 rest in find_int 0 2 0 1 lst;;
這裏使用了尾遞歸的方法來實現,有點是掃描一遍就能夠找出來,並且原來數組不須要改動,同時時間複雜度保持在O(n)code