1. 簡述
原題:簡略的說,就是乙個id列表,其中每個id都可能重複出現,其中乙個id的重複出現個數超過了列表長度的一半。要求快速找到這個id。
擴充套件:id列表中,有三個id,這三個id重複出現的次數,都超過了列表長度的1/4。要求快速找到這個id。
2. 思路
原題的思路是儲存乙個id和該id的計數,然後遍歷id列表,如果當前沒有儲存的id(即id對應次數為0),那麼儲存遇到的id,並且計數設定為1;如果遇到的id剛好是儲存的id,那麼計數加1;如果遇到的id是乙個新的id,那麼id的計數減1。這樣遍歷之後,儲存的id必然就是所求id。因為所求的id佔id列表長度一半以上,並且只有不同的兩個id才會消減,所以,無論消減順序如何,最後超過一半以上的id一定是不會被消減掉的,也是唯一乙個不會被消減掉的。
擴充套件題目的思路是,儲存三個id和對應三個計數,然後遍歷id列表,如果當前有沒有儲存的id(即有id對應次數為0),那麼儲存這個id,並且將對應的計數設定為1;如果遇到的id是乙個已經儲存的id,那麼將對應id的計數加1;如果遇到的id是乙個新的id,而且此時已經儲存了三個id了,那麼這三個id的計數分別減1。由於n次遍歷,最多消減n/4個id,而要求的三個id次數都大於n/4,因此這三個id肯定不會被消掉,而最後只儲存了三個id,要求的三個id又不會被消掉,那麼必然說明儲存的三個id就是要求的這三個id。
基本上很容易擴充套件到k個id,其中每個id出現的次數都超過n/(k+1)次的情況,其中,n為id列表長度。
3. **
這個略了吧。
4. 參考
程式設計之美-2.3-尋找發帖「水王」
尋找發帖「水王」--《程式設計之美》筆記
程式設計之美 2 3 尋找發帖「水王」
題目 尋找乙個id列表中,有乙個id超過了總數的一半,找出這個id 分析 可以對id進行排序,因為需要尋找的id超過了一半,所以該id列表id n 中,id n 2 一定是這個id值。複雜度為o nlgn 1 如果用排序這種方法解決的話,複雜度應該就維持在這個水平,不會降低。再思考一下,難道一定需要...
程式設計之美2 3 尋找發帖水王
這道題目由於不容易寫測試用例,所以,可以把題目轉換為 在乙個陣列中,有乙個數字出現的次數超過了陣列大小的一半,這和題目原意是一樣的。這道題目的思想是我們同時去掉陣列中兩個不一樣的數字,那麼,陣列中原來存在的規律是不變的 僅針對這個題目 好吧,還是先給出函式宣告 2.3 尋找發帖水王 bool dut...
程式設計之美2 3 尋找發帖「水王」
題目1 找到陣列中出現次數超過一半的元素 解法 使用另外不到1 2的元素與所求元素進行抵消 整個陣列抵消不同的兩個數,則超過1 2的元素還是原來的元素 public class main public static int findnum int input throws exception if ...