算法:对于数组的每个元素,找出其左侧的最大值并小于其自身

时间:2017-04-05 08:56:49

标签: arrays algorithm

例如,给定一个数组:

[1, 2, 5, 4, 2, 6, 7, 3]

找出每个元素在其左侧的最大值并且小于它本身(如果不存在这样的元素,则为-1):

[-1,1, 2, 2, 1, 5, 6, 2]

什么是最佳算法?是否有比O(n*log(n))更好的算法?

1 个答案:

答案 0 :(得分:3)

Bruteforce算法迭代数组,逐个搜索被访问的元素并与当前元素进行比较。因此,这是O(n^2)算法。

加快流程的关键是搜索部分。我们必须充分利用我们已经已知的,这是我们访问过的元素。

然后基本算法如下:

magic = new magic_data_structure
result = []
for x in input_array:
    y = magic.find_largest_but_less_than_current(x)
    result.push(y)
    magic.inesrt(x)

因此,我们需要一个具有插入和搜索复杂度O(logn)的数据结构。这通常是一个平衡的搜索树。例如,我们可以使用红黑树。

为简单起见,我们可以使用c ++ stl中的set。有关详细信息,请参阅以下代码。

示例链接:http://ideone.com/5OIBCp

#include <bits/stdc++.h>
using namespace std;

using vi = vector <int>;

set <int> s;

vi foo(vi const &a) {
    vi ret;
    s.clear();
    for (auto const x: a) {
        auto it = s.lower_bound(x);
        if (it != begin(s)) {
            it = prev(it);
            ret.push_back(*it);
        } else {
            ret.push_back(-1);
        }
        s.insert(x);
    }
    return ret;
}

int main() {
    vi a = {1, 2, 5, 4, 2, 6, 7, 3};
    vi b = foo(a);
    for (auto x: b) printf("%d ", x); puts("");
    return 0;
}

https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree