您可以使用二進制搜索解決問題,在O(lg(n))中解決它,而不考慮這麼多邊界情況。這個想法是使用二進制搜索來找到大於或等於要綁定的值的最小元素(我們稱之爲x
)。
pair<int, int> FindInterval(const vector<int>& v, int x) {
int low = 0, high = (int)v.size();
while (low < high) {
const int mid = (low + high)/2;
if (v[mid] < x) low = mid + 1;
else high = mid;
}
// This if is used to detect then a bound (a <= x <= x) is impossible but a
// bound (x <= x <= can be found).
if (low == 0 && low < (int)v.size() && v[low] == x) ++low;
return make_pair(low - 1, low);
}
注意,答案可能是(-1, 0)
,表明沒有下界的間隔,這可能是(n - 1, n)
,這表明不存在上限的間隔(其中,n
是v
大小) 。另外,如果x
在v
中,則可以有兩個可能的答案,並且如果x
在v
中多次出現,則可以有多個答案,因爲邊界包括極值。
最後,您也可以替換與std::lower_bound
功能的二進制搜索:
pair<int, int> FindInterval(const vector<int>& v, int x) {
// This does the same as the previous hand-coded binary search.
const int low = (int)(lower_bound(v.begin(), v.end(), x) - v.begin());
// The rest of the code is the same...
}
是元素獨特之處? – Jacob 2010-08-26 16:55:01
我肯定會嘗試一個修改的二進制搜索算法... – ultrajohn 2010-08-26 16:56:10
@Jacob:是的,我會設置 - 事先查看數據,以消除任何欺騙。 – 2010-08-26 17:01:50