单调递增栈的解法这个讲的挺清楚的
就贴个java的code。

时间: O(n) 虽然是两层循环,但是每个数最多进/出栈一次
空间: O(n)

import java.util.*;

public class Solution {
    public int[][] foundMonotoneStack (int[] nums) {
      int[][] ans = new int[nums.length][2];
      // 找左边最近小数
      // stack规则: 从左向右push index,stack保持单调递增(相对于nums[index])
      Deque<Integer> stack = new ArrayDeque<>();
      for (int i = 0; i < nums.length; i++) {
        while (!stack.isEmpty() && nums[stack.peek()] >= nums[i])
          stack.pop();
        // 此时stack的顶端一定是离nums[i]最近的左侧小数的下标
        ans[i][0] = stack.isEmpty() ? -1 : stack.peek();
        stack.push(i);
      }
      
      // 找右侧最近小数
      // stack规则: 从右向左push index,stack保持单调递增(相对于nums[index])
      stack.clear();
      for (int i = nums.length-1; i >=0; i--) {
        while (!stack.isEmpty() && nums[stack.peek()] >= nums[i])
          stack.pop();
        // 此时stack的顶端一定是离nums[i]最近的右侧小数的下标
        ans[i][1] = stack.isEmpty() ? -1 : stack.peek();
        stack.push(i);
      }
      
      return ans;
    }
}