在整数数组中查找最接近的数字

时间:2019-11-03 16:51:25

标签: c++ arrays closest

给定一个有序整数数组,我想找到最接近给定数字的值。数组可能包含重复值和负数。 一个例子 : 输入:arr [] = {-5,2,5,6,7,8,8,9};        目标数量= 4 输出:5

哪个是最快的算法?二进制搜索? STL找到算法了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

std库中有一种算法几乎可以完全满足您的要求:std::lower_bound

  

返回指向[[first,   不小于(即大于或等于)值,或不大于   如果找不到这样的元素。

您可以使用它来查找等于或高于目标的第一个元素。答案是前面的那个数字。


检查以下示例:

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执行二进制搜索,因此此方法的复杂度在输入集合的大小上是对数的。 这比幼稚的解决方案要快得多,在幼稚的解决方案中,您将遍历整个集合并逐个检查每个元素。