这是我能想到的最快的方式。另外,请注意:您定义的时间间隔为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