擴充套件:隨著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 且只需要常熟...