首页 > 解决方案 > 在点数组中找到最小值的算法

问题描述

我有一个具有最小值的值向量,但在它之后不减少,之前不增加。这是示例:

std::vector<int> arr = {90, 80, 70, 60, 55, 62, 71, 89, 104}

在示例中,我想找到 55。我希望能够有效地找到它的最小值。O(n) 复杂度是不够的。据说,可以对二进制搜索进行某种修改,但我想知道是否有现有的解决方案。

标签: c++algorithmsearch

解决方案


您可以实现 O(lg n) 复杂度,如下所示:

int findTurningPoint(const vector<int>& v, int begin, int end) {
    int mid = (begin + end) / 2;
    if (v[mid - 1] > v[mid] && v[mid + 1] > v[mid]) {
        return mid;
    } else if (v[mid - 1] > v[mid]) {
        return findTurningPoint(v, mid + 1, end);
    } else if (v[mid - 1] < v[mid]) {
        return findTurningPoint(v, begin, mid - 1);
    }
}

vector<int> arr = {90, 80, 70, 60, 55, 62, 71, 89, 104};
cout << findTurningPoint(arr, 0, arr.size() - 1); // 4

方法说明:

选择向量中间的元素。通过与邻居比较来检查它是否形成最小值。如果不是,则查找该元素及其相邻元素是否形成递增序列。如果是这样,请对中间元素左侧的所有元素重复上述过程。否则,对中间元素右侧的所有元素重复该过程。


推荐阅读