码迷,mamicode.com
首页 > 其他好文 > 详细

503.下一个更大元素 II

时间:2020-07-14 18:04:02      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:数据   stact   round   这一   技术   第一个   weight   UNC   gre   

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

 

503.下一个更大元素 II

标签:数据   stact   round   这一   技术   第一个   weight   UNC   gre   

原文地址:https://www.cnblogs.com/lanpang9661/p/13300341.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!