如何找到数组中给定索引的前一个最小元素?

How to find previous smallest element of a given index in the array?

例如,我有一个

input array 
[1,3,5,6,4,8,4,3,2,1]

output should be [-1 , 1, 3, 5, 3 , 6, 3, 1, 1, -1]

解释: 让我们将第一个元素保留为 -1,因为之前没有更小的元素。

In index '1' the previous smaller element to 3 needs to be stored. i.e 1.

In index '2' the previous smaller element to 5 needs to be stored. i.e 3. & so on...

我知道我可以在 O(n2) 复杂度内解决这个问题。但我想以 O(n) 复杂度解决这个问题。我试过了,还是不行。

请帮我解决这个问题。提前致谢。

我想你想在 O(n) 时间内解决它。 您可以在这里找到答案:https://www.geeksforgeeks.org/find-the-nearest-smaller-numbers-on-left-side-in-an-array/

O(n) 可能是不可能的,但我可以给你 O(n log n) 的方法。创建平衡的 BST(大多数编程语言中的 set/dictionary 结构)。您现在可以通过遍历树轻松找到小于 x 的最大数字。

Set/dictionary 结构通常有一个称为上限的内置函数,它会找到大于 x 的最小元素(如果你决定更改排序顺序,则找到最大的元素)。你也可以用那个。

您只需:

对于数组中的每个值 v:

  • 求BST中小于v的最大数,

  • 将 v 插入 BST

 //NEAREST SMALLEST TO LEFT'S INDEX
    //CREATE A NEW STACK
    Stack<Integer> stack = new Stack<>();
    //ARRAY TO STORE OUTPUT VALUES
    int[] ans = new int[n];
    //TRAVERSE FROM LEFT TO RIGHT OF INPUT ARRAY
    for(int i=0; i<n; i++){
        //HERE WE PERFORM 3 OPERATIONS
        /* 1ST) WHILE STACK IS NOT EMPTY
        IF YOU FIND ANYTHING >= TO ARR[I] POP*/
        while(!stack.empty() && arr[stack.peek()] >= arr[i]){
            stack.pop();
        }
        /* 2ND) IF STACK IS EMPTY RETURN -1 
          (WHATEVER AS PER YOUR NEED) */
        if(stack.empty()){
            ans[i] = -1;
        }
        /* 3RD) WE FOUND NEAREST SMALLEST TO LEFT */
        else{
            ans[i] = stack.peek();
        }
        //PUSH INDEX TO STACK
        stack.push(i);
       
    }