例如,给定一个数组:
[1, 2, 5, 4, 2, 6, 7, 3]
找出每个元素在其左侧的最大值并且小于它本身(如果不存在这样的元素,则为-1):
[-1,1, 2, 2, 1, 5, 6, 2]
什么是最佳算法?是否有比O(n*log(n))
更好的算法?
答案 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
。有关详细信息,请参阅以下代码。
#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