這是我能想到的最快的方式。另外,請注意:您定義的時間間隔爲6,但隨後表示,它包含的項目30至36(那7項),所以我基於這樣寫這個代碼:
int GetInterval(const vector<int> &sortedList, int intervalLength)
{
int lowest = sortedList[0];
int highest = sortedList[sortedList.size()-1];
vector<int> intervals(highest-lowest-intervalLength+1, 0);
int max = 0;
for(int i = 0; i < sortedList.size(); i++)
{
int base = sortedList[i] - lowest;
for(int j = -intervalLength; j <= intervalLength; j++)
{
int index = i + j + base;
if(index < 0 || index >= intervals.size()) continue;
if(++intervals[index] > intervals[max]) max = index;
}
}
return max + lowest;
}
所以,我的天堂」實際上跑這個,但它應該工作。其大O是排序列表的長度乘以區間長度。如果你把整個區間長度作爲一個常量,那麼它就是O(n)。希望這對你有用。另外,我希望C++也適合你。
*注意它返回間隔中的最小數字。
編程語言是否重要,或者是任何語言的算法(甚至是僞代碼)都很好? – BoltClock 2011-01-21 02:03:17