我有问题。 给定一个数组,找到所有可能子数组的最小整数和第二个最小整数,其中子数组是原始数组的连续子集。
例如考虑数组A = [5,6,1,2,9,3]。 显然,子阵列大小至少为2,因此我们总共有(n)*(n + 1)/ 2-n个子阵列。 (从总数中减去大小为1的n个子阵列)。这是一个直接的O(n ^ 2)解决方案,检查每个子阵列并记录所需的整数。但我认为可以使用堆栈在O(n)中完成。但我无法直观地使用它来达到最佳解决方案。 任何帮助,建议,方向将不胜感激。
答案 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(你已经处理了左边可能的对)。
中查看