【问题标题】:Find closest number in integer array在整数数组中查找最接近的数字
【发布时间】:2019-11-03 16:51:25
【问题描述】:

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

最快的算法是什么?二进制搜索? STL 查找算法?

感谢您的帮助。

【问题讨论】:

  • 我会使用二分搜索 x) 我认为没有更快的方法
  • 二分查找-std::lower_bound,检查返回的迭代器是否不是结束迭代器,如果存在则检查之前的迭代器。
  • 二分查找只有在数组排序后才能工作。否则,别无选择,只能穷尽搜索。
  • 提到数组是有序的

标签: c++ arrays closest


【解决方案1】:

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 执行二进制搜索。 这比一个简单的解决方案要快得多,在这种解决方案中,您将遍历整个集合并逐个检查每个元素。

【讨论】:

  • std::lower_bound 假定数组已排序。
  • @ALX23z 数组已排序。再次阅读问题=)
  • 对不起。兆。但是,此算法找不到最接近的值。你应该稍微调整一下迭代器。
  • 不,它会返回一个值,即不小于给定的值。尝试搜索 3。它会返回 5,但应该是 2。
  • 最终的边缘情况是,如果你搜索一个大于向量中所有值的元素,它必须返回A.back(),如果A.empty()则抛出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多