【編程之美】2.3 – 尋找發貼”水王”

來源:互聯網
上載者:User

問題描述:”水王“發貼數超過所有文章總數的一半,現有此論壇上所有文章的列表,包含ID,如何快速找出這個水王?


解法一:對所有ID進行排序,再掃描一遍排好序的ID列表,統計各個ID出現的次數,如果某個ID出現的次數超過總數的一半,那麼就輸出這個ID。時間複雜度為O(N*log2N + N).

解法二:既然已經排好序,而且有某個ID出現的次數超過總數的一半,那麼ID列表的中間項一定是這個ID。複雜度為O(1)。

解法三:如果每次刪除兩個不同的ID(不管是否包含"水王"的ID),那麼在剩下的ID列表中,"水王"的ID出現次數肯定仍然超過總數的一半。這樣不斷重複這個過程,總量就可以降低,從而避免了排序的操作,複雜度為O(N).

Type Find(Type* ID, int N){     Type candidate;     int nTimes, i;     for(i = nTimes = 0; i < N; i++)     {          if(nTimes == 0)          {               candidate = ID[i], nTimes = 1;          }          else          {               if(candidate == ID[i])                    nTimes++;               else                    nTimes--;          }     }     return candidate; }

後記:解法三體現了電腦科學中很普遍的思想:把一個問題轉化為規模較小的若干個問題。演算法裡面的分治,遞推與貪心等都是基於這樣的思路。




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.