单调栈的使用情况:对序列中每个元素,找到下一个比它大的元素。

    1. // 给Array原型添加peek函数,取出栈顶指针
    2. Array.prototype.peek = function(){
    3. return this[this.length-1];
    4. };
    5. // 给Array原型添加isEmpty函数,判断栈是否为空
    6. Array.prototype.isEmpty = function(){
    7. return this.length===0?true:false;
    8. };
    9. function nextGreaterElement(nums) {
    10. let stack = new Array();
    11. let ans = new Array(nums.length);
    12. ans.fill(-1);
    13. for(let i=0;i<nums.length-1;i++){
    14. while(!stack.isEmpty() && nums[stack.peek()]<nums[i]){
    15. ans[stack.pop()]=i;
    16. }
    17. stack.push(i);
    18. }
    19. return ans;
    20. }

    测试:

    1. let nums = [73,74,75,71,69,72,76,73];
    2. let ans = nextGreaterElement(nums);
    3. console.log(ans);
    4. /******************************
    5. [ 1, 2, 6, 5, 5, 6, -1, -1]
    6. ******************************/

    执行过程如下,不过这里我是用ans保存的下一个较大元素的位置,而不是位置差:
    当然,保存下一个较大元素的位置有两种方式:

    • 使用数组,建立两个位置的索引关系
    • 使用Map,建立值与下一个较大元素的位置的索引关系

    image-20210207220641402.png