我有一个正数的数组A[1,...,n]
,例如:
[1, 2, 5, 3, 7, 2, 8, 4]
我需要根据定义构建一个数组S[1,...,n]
:
S[i] = max {k|∀i−k <j≤i :A[j] ≤ A[i] and k ≤ i}
这意味着找到最长的子数组A[i − k,..,i]
,其中所有元素对于数组中的每个索引都小于或等于A[i]
。
我需要编写一个算法,使用Stack 在 O(n)中创建数组S.
例如对于数组[1,2,4,3,5]我需要返回数组[1,2,3,2,5]
谢谢。
答案 0 :(得分:1)
您可以在堆栈中为每个递增数字的序列存储(current_maximum,size_of_sequence)。在每次迭代中,您应该为序列添加值(如果新值更大,则可选择合并相邻序列)
#include <stack>
#include <vector>
#include <utility>
std::vector<int> leq_subarrays(const std::vector<int>& numbers) {
if (numbers.empty()) {
return std::vector<int>();
}
std::vector<int> answer(numbers.size());
std::stack<std::pair<int, int>> s;
s.push(std::make_pair(numbers[0], 1));
answer[0] = 1;
for (size_t i = 1; i < numbers.size(); ++i) {
const auto& value = numbers[i];
int count = 1;
while (!s.empty() && s.top().first <= value) {
count += s.top().second;
s.pop();
}
s.push(std::make_pair(value, count));
answer[i] = count;
}
return answer;
}
指向Ideone的链接:http://ideone.com/SlZorX