數字之魅 尋找發帖水王

2021-07-04 02:49:04 字數 1230 閱讀 1243

尋找發帖水王這個題目給了我很大的啟發,同時開闊了視野,往往在解決這型別問題的時候第一想法都是先排序再計算。而本題卻給出了乙個非常好的思路,時間複雜度為o(n)。

它還有乙個擴充套件問題,但是我在網上看了幾篇有的寫的考慮不周全,有的寫的邏輯不是很清楚,這裡我也根據思考和查閱,給出我自己的解法。

typedef

int type; //給出id的乙個抽象

type candidate[3] = ; //說明傳的這個引數前要初始化。

void find3(type* id,int n,type* candidate);

for(i=0;iif(ntimes[0] == 0)

else

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

candidate[0] = id[i];

}else

if(ntimes[1] == 0)

else

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

candidate[1] = id[i];

}else

if(ntimes[2] == 0)

else

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

candidate[2] = id[i];

}else

if(candidate[0] == id[i])

ntimes[0]++;

else

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

ntimes[1]++;

else

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

ntimes[2]++;

else

}}

這裡我採用引數了作為返回值結果,一方面因為很多時候會出現下面這種情況:

type* find3(type* id,int n);

//...

return candidate;

}

這樣函式退出結果就沒有了,candidate指向了棧的某個未知區域了。

或者 type* find3(type* id,int n)

在find3中new,但是在**去釋放呢。我還是比較喜歡在**new就在**delete。

最後,在判斷ntimes[0] == 0的時候還要判斷id[i]與其他candidate是否相等的情況,所以我要求candidate要先初始化。

尋找發帖「水王」

分析與解法 首先想到的是乙個最直接的方法,我們可以對所有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 且只需要常熟...