1.問題描述
快速找出發帖超過一半的的id2.分析與解法問題變型:
現在有乙個陣列,已知乙個數出現的次數超過了一半,請用最小的複雜度的演算法找出這個數。
問題擴充套件:
有三個發帖很多的id,他們的發帖數目超過了帖子總數目的1/4,請從發帖id列表中找出它們
每次從列表中刪除兩個不同的id,那麼剩下的id列表中,「水王」的id出現次數仍然超過剩餘數目的一半,因此每次刪除兩個不同的id,直到剩下的所有id都相同,那麼剩下的就是水王的id。
我們可以設定乙個candidate和乙個計數器ntimes,candidate為id列表第乙個id,ntimes初始值為0,遍歷整個id列表,當遍歷的id與candidate相同,ntimes++,如果不同則ntimes--,此時相當於成對刪除不同的id,當ntimes又為0的時候,更新candidate,將其設定為當前遍歷的id,因為有乙個id總是在剩餘中的id超過一半,所以最後ntimes大於0,candidate即為所求。
int find(int* id, int n)else
else}}
return candidate;
}
擴充套件問題:依據以上的原理,我們可以以四個為單位進行比較,如果四個id均不相同則刪掉四個id,那麼所要求的三個id,仍然超過其餘id的1/4。
相應的**實現:
void find3(int * id, int n); int i;
for (i = 0; i < n; i++)
} else if (ntimes[1] == 0)
} else if (ntimes[2] == 0)
} else
} printf("三個水王id分別是:%d,%d,%d\n", candidate[0], candidate[1], candidate[2]);
}
程式設計之美 尋找發帖「水王」
描述 直接拍照,懶得打字 此題很容易轉換為,在乙個陣列中,有乙個數出現的次數超過了陣列元素個數的一半,請找出這個元素。方法一 對陣列排序進行排序,利用通常的排序方法,複雜度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 ...