• 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;
    };
  • 相关阅读:
    unity-疑难杂症(一)
    unity-【UI】点击交互(一)
    asp.net core 附加进程调试、指令等
    几种定时器(timer)的区别
    ObjectDisplay 对象属性展示 Display
    IEnumerable,ICollection,IList,List 比较
    Excel等格式文件从服务端调用导出
    Azure DevOps 与VS 2019
    从 数据库表 生成 项目实体 文件
    Border样式
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/13300341.html
Copyright © 2020-2023  润新知