2020-07-14
下一个更大元素 II
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),
输出每个元素的下一个更大元素。数字 x
的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,
这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
题解:
思路1:栈
/** * @param {number[]} nums * @return {number[]} */ // 重点是 stack栈是一个递减的栈 它的数据永远是 5-4-3-2-1 不可能出现 5-6-4-3这种 // 也就是说栈顶的永远是最小的 var nextGreaterElements = function (nums) { let l = nums.length; // 结果数组的长度和nums是一样的 因为如果没有更大的值就取-1 所以默认直接用-1填满数组 let ans = new Array(l).fill(-1); let stack = []; // stact栈记录的是当前存入的项 如果这一项找到了比他更大的值 那么这一项会被pop()出栈 for (let i = 0; i < 2 * l - 1; i++) { // 遍历2n次 因为nums的尾部可能要从头去取更大的值 // i % l 的值 是遍历到nums的第几项 因为2n次遍历 是两遍 不可以直接取i // 如果stact栈中有存入的项 且nums的当前项比栈顶对应的nums大 那么就是找到了栈顶对应的nums那一项的更大值 while (stack.length && nums[i % l] > nums[stack[stack.length - 1]]) { // 栈顶对应的那一项的更大值找到了 赋值到ans的对应位置 ans[stack[stack.length - 1]] = nums[i % l]; // 已经找到更大值的栈顶出栈 stack.pop(); // 出栈后 如果栈中还有数据 要继续处理 } // 如果ans结果数组中的第 i % l 项是-1 说明这一项还没找到比他更大的值 把 i % l 放入栈中 // 在第二遍的遍历中 因为已经处理了某些项 所以不出再将这些项入栈 if (ans[i % l] === -1) stack.push(i % l); } return ans; };