題目的本質就是在一堆id中,找出重複次數大於總數一半的id。由於數量超過總數的一半,所以可以利用這點,讓不同的id之間互相抵消,最後剩下的肯定是總數最大的id。
舉個簡單的例子,比如有不同門派的黑幫,有一幫人數大於總共人數的一半,那麼就讓不同門派的人pk,假設結果都是兩敗俱傷,最後還是會剩下沒受傷的人,那些人肯定屬於那個最大的黑幫。
假設最多的id數量為m,其他的id總數為n,m>n,最後剩下的id的個數是m-n嗎,應該不是的,因為會有n裡面互相抵消的情況,所以最後的數量會》m-n。
擴充套件問題:
同樣設想為很多黑幫,有3個黑幫比較強大,各超過1/4。最壞的情況,其他所有的黑幫聯合起來和這3家黑幫火拼,但規則是不同的四個黑幫才能互相抵消,而不是之前的2個,如果不存在不同的4個黑幫,則每出現乙個人,只給本幫的人數加一。如果發現某個黑幫之前人數較多,但後來人數減為0,則用新出現的黑幫代替他的位置。
程式設計之美 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 ...