程式設計之美 2 3 尋找發帖「水王」

2021-06-09 22:49:18 字數 743 閱讀 4344

題目:尋找乙個id列表中,有乙個id超過了總數的一半,找出這個id

分析:可以對id進行排序,因為需要尋找的id超過了一半,所以該id列表id[n]中,id[n/2]一定是這個id值。複雜度為o(nlgn+1),如果用排序這種方法解決的話,複雜度應該就維持在這個水平,不會降低。再思考一下,難道一定需要排序嗎,針對這個問題,我們只是想找出id數量超過一半的那個唯一的id。如果每次刪除兩個不同的id,那麼數量超過一半的那個id在剩下的id列表中總會維持超過一半的數量,最後剩下的就一定是該id。

/*尋找發帖水王,演算法有些類似於尋找最大和子串行*/

type find(type * id, int n)else

}return candicate;

}

擴充套件問題:

「超級水王」沒有了,有3個id發帖也很多,每個人都超過帖子總數的1/4了,怎麼快速找到這三個id?

思路和「超級水王」的是一樣的,只是這次需要有三個candicate[3],和三個ntimes[3]。如果找到與這三個id相同的,則對應的加1,如果都不相同,則三個id數量都要減1

/*尋找發帖水王,演算法有些類似於尋找最大和子串行*/

type *find(type * id, int n)else }}

//與這三個id都不同,則都要減1

if(j == 3)

}return candicate;

}

程式設計之美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 ...

程式設計之美 2 3 尋找發帖「水王」

1.簡述 原題 簡略的說,就是乙個id列表,其中每個id都可能重複出現,其中乙個id的重複出現個數超過了列表長度的一半。要求快速找到這個id。擴充套件 id列表中,有三個id,這三個id重複出現的次數,都超過了列表長度的1 4。要求快速找到這個id。2.思路 原題的思路是儲存乙個id和該id的計數,...