程式設計之美 發帖水王

2022-08-14 23:54:08 字數 1062 閱讀 5557

題目:

分析:

最直接的方法,我們可以對所有id排序。然後再掃瞄一遍排好序的id列表,統計各個id出現的次數。如果某個id出現的次數超過總數的一半,那麼就輸出這個id。這個演算法的時間複雜度為o(n*log2n+n)。

如果id列表已經是有序的,還需要掃瞄一遍整個列表來統計各個id出現的次數嗎?

如果乙個id出現的次數超過總數的一半。那麼,無論水王的id是什麼,這個有序的id列表中的第n/2項(從0開始編號)一定會是這個id。不必再次掃瞄列表。如果能夠迅速定位到列表的某一項,除去排序的時間複雜度,後處理的需要的時間為o(1)。

上述這兩種方法都需要先對id列表進行排序,時間複雜度方面沒有本質的改進。能否避免排序呢?

如果每次刪除兩個不同的id(不管是否包含「水王」id),那麼剩下的id列表中,「水王」id出現的次數仍然超過總數的一半。可以通過不斷重複這個過程,把id列表中的id總數降低**化為更小的問題),從而得到答案。這個思路,避免了排序這個耗時的步驟,總的時間複雜度只有o(n),且只需要常數的額外記憶體。**如下;

public

static

int findkingid (int id,int

n)

else

else}}

return

blogking;

}

這個題目體現了電腦科學中很普遍的思想,就是如何把乙個問題轉化成規模較小的若干子問題。分治、遞推和貪心都是基於這樣的思路。在轉化過程中,小問題跟原問題的本質上一致。同樣我們可以將小問題轉化為更小的問題。因此,轉化過程是很重要的。像上面的這個題目,我們保證了問題的解在小問題中仍然具有與原問題相同的性質:

水王的id在id列表中的數量超過一半。轉化的效率越高,轉化之後問題規模縮小的越快,則整體的時間複雜度越低。

程式設計之美 發帖水王

問題是,在論壇上乙個人非常喜歡發帖,且他發的帖子數目超過了帖子總數的一半,要想快速的找出這個id,怎麼辦?首先可以先把所有帖子按id進行排序,把排序結果存進陣列裡面,然後直接索引n 2即可得到那個id。時間複雜度是n logn.還可以從另外乙個角度來看這個題,因為他的帖子數目超過了總數的一半,因此,...

程式設計之美發帖水王拓展問題

程式設計之美中的 尋找發帖水王 描述的是這麼乙個問題,有乙個id列表,其中有乙個id 水王的id 出現的次數超過了一半,請找出這個id。書中的思路是每次從列表中刪除兩個不同的id,不影響 水王的id在剩餘id中仍然超過一半 這一事實,因此每次刪除兩個不同的id,直到剩下的所有id都相同,那麼剩下的就...

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

描述 直接拍照,懶得打字 此題很容易轉換為,在乙個陣列中,有乙個數出現的次數超過了陣列元素個數的一半,請找出這個元素。方法一 對陣列排序進行排序,利用通常的排序方法,複雜度o nlgn 再遍歷一遍陣列,找出那個元素,複雜度為o n 空間複雜度o 1 方法二 空間換時間吧,在開闢乙個陣列,hash對映...