[英]Find closest number in integer array
給定一個排序整數數組,我想找到最接近給定數字的值。 數組可能包含重復值和負數。 一個例子: Input:arr[] = {-5, 2, 5, 6, 7, 8, 8, 9}; 目標數 = 4 Output:5
最快的算法是什么? 二進制搜索? STL 找到算法?
謝謝你的幫助。
std
庫中有一個算法幾乎完全符合您的要求: std::lower_bound
返回一個迭代器,該迭代器指向范圍 [first, last) 中不小於(即大於或等於)值的第一個元素,如果沒有找到這樣的元素,則返回 last。
您可以使用它來查找等於或高於目標的第一個元素。 答案是它前面的那個數字。
檢查以下示例:
int find_closest(const vector<int>& A, const int a)
{
if(A.size() <=0)
throw std::invalid_argument("empty array");
const auto lb = std::lower_bound(A.begin(), A.end(), a);
int ans = lb!= A.end() ? *lb : A.back();
if (lb != A.begin()) {
auto prec = lb - 1;
if (abs(ans - a) > abs(*prec - a))
ans = *prec;
}
return ans;
}
這種方法的復雜性與輸入集合的大小成對數,因為lower_bound
執行二進制搜索。 這比一個簡單的解決方案要快得多,在這種解決方案中,您將遍歷整個集合並逐個檢查每個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.