所有元素小于或等于A [i]的最长子阵列

时间:2016-04-01 12:53:37

标签: arrays algorithm stack time-complexity

我有一个正数的数组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]

谢谢。

1 个答案:

答案 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