503.下一个更大元素 II

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;
};

 

posted @ 2020-07-14 17:38  蓝小胖纸  阅读(190)  评论(0编辑  收藏  举报