尋找發帖水王

2021-07-27 07:21:38 字數 1463 閱讀 4104

擴充套件:隨著tango的發展,管理員發現,「超級水王」沒有了。統計結果表明,有3個發帖很多的id,他們的發帖數目都超過了帖子總數目n的1/4。你能從發帖id列表中快速找出他們的id嗎?

分析:在這個題目中,有乙個電腦科學中很普遍的思想,就是如何把乙個問題轉化為規模較小的若干個問題。分治、遞推和貪心等都有這樣的思想。在轉化過程中,如果能保證小的問題跟原問題的解是一致的就成功了。這樣,我們可以通過尋找這樣的方式將小問題轉化為更小的問題。如何將大問題拆成小問題,或者如何大規模的資料降成小規模,而不影響解呢?

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

**如下:

#include typedef int type;

type find (type *a, int n)

else

else

}} return candiate;

} int main()

; printf("over harf id is %d\n", find(arr, 12));

return 0;

}

解擴充套件題:

求解內容極其相似,相同的思路進行求解即可。同時刪除4個不同的id後,剩餘資料中3個多數id仍然是多數id。

上題只需要乙個結果,而現在需要3個結果,上題用到的ntimes,也應改為3個計數器。現在我們需要3個變數來記錄當前遍歷過的3個不同的id,而ntimes的3個元素分別對應當前遍歷過的3個id出現的個數。如果遍歷中有某個id不同於這3個當前id,我們就判斷當前3個id是否有某個的ntimes為0,如果有,那這個新遍歷的id就取而代之,並賦1為它的遍歷數(即ntimes減1),如果當前3個id的ntimes皆不為0,則3個id的ntimes皆減去1。

#include using namespace std;

int candidate[3];

int count[3] = ;

int input[100];

int num = 0;

int main()

bool flag = false;

for (int i = 0;i < num;i++)

if (candidate[j] == input[i])

}if (flag == true)

for (int j = 0;j < 3;j++)

}if (flag == true)

for (int j = 0;j < 3;j++)

}cout<

尋找發帖「水王」

分析與解法 首先想到的是乙個最直接的方法,我們可以對所有id進行排序。然後再掃瞄一遍排好序的id列表,統計各個id出現的次數。如果某個id出現的次數超過總數的一半,那麼就輸出這個id。這個演算法的時間複雜度為o n log2 n n 如果id列表已經是有序的,還需要掃瞄一遍整個列表來統計各個id出現...

尋找發帖水王

首先想到的是乙個最直接的方法,我們可以對所有id進行排序。然後再掃瞄一遍排好序的id列表,統計各個id出現的次數。如果某個id出現的次數超過總數的一半,那麼就輸出這個id。這個演算法的時間複雜度為o n log2 n n 如果id列表已經是有序的,還需要掃瞄一遍整個列表來統計各個id出現的次數嗎?如...

尋找發帖「水王」

題目 解法1 對所有id排序,因為該id出現的次數超過總數的一半,對有序的序列,第n 2項即為所求id。解法2 每次刪除兩個不同的id,那麼剩下的id列表中,水王 的id次數仍然超過總數的一半。可以通過不斷重複這個過程,把id列表中的id總數降低,從而得到答案。總的時間複雜度只有o n 且只需要常熟...