单调栈的使用情况:对序列中每个元素,找到下一个比它大的元素。
// 给Array原型添加peek函数,取出栈顶指针Array.prototype.peek = function(){return this[this.length-1];};// 给Array原型添加isEmpty函数,判断栈是否为空Array.prototype.isEmpty = function(){return this.length===0?true:false;};function nextGreaterElement(nums) {let stack = new Array();let ans = new Array(nums.length);ans.fill(-1);for(let i=0;i<nums.length-1;i++){while(!stack.isEmpty() && nums[stack.peek()]<nums[i]){ans[stack.pop()]=i;}stack.push(i);}return ans;}
测试:
let nums = [73,74,75,71,69,72,76,73];let ans = nextGreaterElement(nums);console.log(ans);/******************************[ 1, 2, 6, 5, 5, 6, -1, -1]******************************/
执行过程如下,不过这里我是用ans保存的下一个较大元素的位置,而不是位置差:
当然,保存下一个较大元素的位置有两种方式:
- 使用数组,建立两个位置的索引关系
- 使用Map,建立值与下一个较大元素的位置的索引关系

