尋找一個長度爲3n的數組中出現次數超過n的元素

思路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

相關文章
相關標籤/搜索