尋找發帖「水王」

2021-06-20 15:39:52 字數 924 閱讀 7669

題目:

解法1:

對所有id排序,因為該id出現的次數超過總數的一半,對有序的序列,第n/2項即為所求id。

解法2:

每次刪除兩個不同的id,那麼剩下的id列表中,「水王」的id次數仍然超過總數的一半。可以通過不斷重複這個過程,把id列表中的id總數降低,從而得到答案。總的時間複雜度只有o(n),且只需要常熟的額外記憶體。

該思路的意思其實就是說,遇到兩個不同的id,我們就將它們一同拋棄。如果這兩個id都不是水王的id,那挺好啊,剩下的水王的id佔的比例更多;如果這兩個id其中有乙個是水王的id,那也沒關係,哥佔的總數超過一半,一對一跟你同歸於盡,剩的還是哥的多。

type find(type* id, int n)

else

}return candidate;}

擴充套件問題: 

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

這個擴充套件問題還是上題所述解法二的思路擴充套件,不過這次是三個id,就是說每四個不同的id再同時拋棄。如果這四個id不包含這三個id,那這三大哥肯定樂啊,剩的都是我們哥三的,如果這四個id包含這三個id中的其中乙個或者幾個,那也沒關係,最壞情況就是我們哥三兒一人出一滴血,乾掉其它勢力一滴血,一直這麼消耗最後剩下的還是我們哥兒三。

void find(type* id, int n,type candidate[3])

else if(id[i]==candidate[1])

else if(id[i]==candidate[2])

else if(ntimes[0]==0)

else if(ntimes[1]==0)

else if(ntimes[2]==0)

else

}return;}

尋找發帖「水王」

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

尋找發帖水王

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

尋找發帖水王

擴充套件 隨著tango的發展,管理員發現,超級水王 沒有了。統計結果表明,有3個發帖很多的id,他們的發帖數目都超過了帖子總數目n的1 4。你能從發帖id列表中快速找出他們的id嗎?分析 在這個題目中,有乙個電腦科學中很普遍的思想,就是如何把乙個問題轉化為規模較小的若干個問題。分治 遞推和貪心等都...