tango是微軟亞洲研究院的乙個試驗專案。研究院的員工和實習生們都很喜歡在
tango
上面交流灌水。傳說,
tango
有一大水王,他不但喜歡發帖,還會回覆其他
idid
也在表中,你能快速找出這個傳說中的
tango
水王嗎?
分析:如果乙個id
出現的次數超過總數
n的一半,那麼先把這些
id排好序,那麼這個有序
id列表的第
n/2項肯定是水王
id,而且
n/2的左邊或者右邊肯定全都是水王的id。
如果id
沒排好序,那麼每次刪除兩個不同的
id(不管是否包含水王的
id),那麼兩兩對消之後,剩下的水王
id仍然是超過一半。這樣子就可以通過重複這個過程把
id總數降低**化為更小的問題)。到最後,剩下的就是水王的
id。這個方法避免了排序這個耗時的步驟,總的時間複雜度為
o(n)
,而且只需要常數的額外記憶體。
在這個題目中,就是如何把乙個問題轉化為規模較小的若干個問題。分治、遞推和貪心等都是基於這樣的思路。在轉化過程中,小的問題跟原本問題本質上是一致。這樣,我們可以通過同樣的方式將小問題轉化為更小問題。因此,轉化過程是很重要的。轉化本身計算的效率越高,轉化之後問題規模縮小得越快,則整體演算法時間複雜度越低。
擴充套件問題:
隨著tango
的發展,管理員發現,超級水王沒有了。統計結果表明,有
3個發帖很多的
id,他們發帖數目都超過了帖子總數n的
1/4.
你能從發帖
id列表中快速找出他們
id嗎?
陣列:6,4,5,4,4,4
開始for
陣列:初始化ntimes
和candidate為0
,如果ntimes為0
,candidate=6
,ntimes=1
;第二次由於ntimes不為0
,而且candidate=1!=4
,那麼ntimes-1=0
;這樣子就將第乙個6
和第二個
4對消了。
下一輪由於ntimes
已經為0
,所以candidate=5,ntimes=1
;到第四個數字4
的時候,由於
ntimes不為0
,而且candidate=5!
=4,那麼
ntimes-1=0
,此時第三個數字5
和第四個數字
4又對消了。
下一輪從從第五個數字4
開始,由於ntimes=0
,所以candidate=5,ntimes=1
;到最後乙個數字4
的時候,由於
(candidate=4)==4
,那麼ntimes+1=2
。**:
view code
1using
system;23
namespace
尋找發帖水王4;
14//
int quarterids = findquarterids(ids, ids.length);
15//
printids(quarterids);
16console.readline();17}
1819
static
int initarray()
2030
for (int i = 23; i < 40; i++)
3134
return
ids;35}
3637
static
void
printids(dynamic t)
38的水王id::
", t.length + 1
, item);44}
45}46else47"
, t);49}
50}5152
static
int findhalfid(int ids, int
len)
5365
else
6670}71
return
candidate;72}
7374
//其實就是把這三個id看成乙個id,然後跟另外乙個id對消(四個不同id對消),對消之後他們的id仍然會超過1/4
75static
int findquarterids(int ids, int
len)
7686
else
if (candidate[1] ==ids[i])
8790
else
if (candidate[2] ==ids[i])
9194
else
if (ntimes[0] == 0)95
99else
if (ntimes[1] == 0
)100
104else
if (ntimes[2] == 0
)105
109else
110115
#endregion
116}
117return
candidate;
118}
119}
120 }
程式設計之美 尋找發帖「水王」
描述 直接拍照,懶得打字 此題很容易轉換為,在乙個陣列中,有乙個數出現的次數超過了陣列元素個數的一半,請找出這個元素。方法一 對陣列排序進行排序,利用通常的排序方法,複雜度o nlgn 再遍歷一遍陣列,找出那個元素,複雜度為o n 空間複雜度o 1 方法二 空間換時間吧,在開闢乙個陣列,hash對映...
程式設計之美 尋找發帖「水王」
基礎問題 找出發帖數超過帖子總數一半的id.拓展問題 有三人發帖數都超過了帖子總數目n 的1 4 找出他們的 id.我們可以先排序然後找出中間的那個id 但可以考慮避免排序來改進時間複雜度。每次從列表刪除兩個不相同的id 剩餘的相同 id就是找到的 水王 type find type id,int ...
程式設計之美 尋找發帖水王
程式設計之美 尋找發帖水王.cpp 定義控制台應用程式的入口點。有乙個水王發帖超過一半 給你發帖所有的id 找到他 統計每個id出現次數 找到最大的 超過一半 include stdafx.h include include include using namespace std class id ...