題目描述:
擴充套件問題:
隨著tango的發展,管理員發現,「超級水王」沒有了。統計結果表明,有3個發帖很多的id,他們的發帖數目都超過了帖子總數目n的1/4。你能從發帖id列表中快速找出他們的id嗎?
把陣列分為四個四個數字一組的來看。由於a的發帖數超過了1/4,所以,平均下來,在每乙個分組裡都有乙個a,並且至少在某一組中有大於乙個的a,假如分組1中的四個數字都不相同,我們刪除分組1,如果a不在分組1裡面,那麼在剩餘的2~n組中,a出現的次數顯然會繼續大於1/4;如果a在分組1裡面,那麼在剩餘2~n組中,平均下來,a還是會至少在每乙個分組出現一次。所以只要分組1中4個數字不相同(主要是保證沒有兩個a),那麼刪除分組1,並不改變a在剩餘陣列中出現次數依然大於1/4的事實。同理b,c。
#include
#include
using
namespace
std;
int find1(vector
&id)
else
}return a;
}void find3(vector
&id)
else
if (a == id[i])
else
if (tb == 0)
else
if (b == id[i])
else
if (tc == 0)
else
if (c == id[i])
else
}cout
<< a << endl << b << endl << c << endl;
}int main();
cout
id2 = ;
find3(id2);
return
0;}
程式設計之美 尋找發帖 水王 擴充套件
1.問題描述 快速找出發帖超過一半的的id 問題變型 現在有乙個陣列,已知乙個數出現的次數超過了一半,請用最小的複雜度的演算法找出這個數。問題擴充套件 有三個發帖很多的id,他們的發帖數目超過了帖子總數目的1 4,請從發帖id列表中找出它們 2.分析與解法 每次從列表中刪除兩個不同的id,那麼剩下的...
程式設計之美2 3尋找發帖水王和擴充套件問題
推薦 include include using namespace std void fun int len 15 int candi arr 0 設定水王候選人是下標為0的編號 int count 1 次數為1 for int i 1 i2 擴充套件問題 有3個發帖很多的id,他們的發帖數目都超...
程式設計之美 2 3尋找發帖「水王」之擴充套件問題
思路與書中2.3節尋找發帖水王的思路類似。每次刪除四個不同的id,那麼在剩下的id中,3個發帖很多的id,發帖數目仍然超過了剩餘帖子總數的1 4。可以不斷重複這個過程,直至id的不同個數等於3。如下 include include using namespace std unsigned numta...