找到O(n)中给定数组的每个子数组的每对最小整数?

时间:2017-09-26 10:48:02

标签: arrays algorithm data-structures stack

我有问题。 给定一个数组,找到所有可能子数组的最小整数和第二个最小整数,其中子数组是原始数组的连续子集

例如考虑数组A = [5,6,1,2,9,3]。 显然,子阵列大小至少为2,因此我们总共有(n)*(n + 1)/ 2-n个子阵列。 (从总数中减去大小为1的n个子阵列)。这是一个直接的O(n ^ 2)解决方案,检查每个子阵列并记录所需的整数。但我认为可以使用堆栈在O(n)中完成。但我无法直观地使用它来达到最佳解决方案。 任何帮助,建议,方向将不胜感激。

1 个答案:

答案 0 :(得分:0)

是的,可以在O(n)中完成,这个想法用来解决这个问题question

For each int i in the array A
    while stack is nonempty
        // current min is stack.top() and A[i]
        if i is less than the top of the stack, pop the stack
        otherwise break the while loop
    If stack is non empty
        // current min is stack.top() and A[i]
    push i onto stack

基本思想是,如果你的堆栈中有一个值b,并且你遇到一个较小的值c,那么b就不能与c右边的任何东西形成一个最小的对。因此,一旦你产生了对(b,c),你就可以安全地处理b(你已经处理了左边可能的对)。

online compiler

中查看