zoukankan      html  css  js  c++  java
  • 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;
    };
  • 相关阅读:
    swiper轮播图在vue项目中使用,报错component lists rendered with v-for should have explicit keys(e积分项目)
    JS获取URL参数(银联二维码用过)
    VUE iscroll(银联二维码,浩哥页面用过)
    js的arguments到底是什么?
    js中arguments的用法
    条形码--JsBarcode(银联二维码用过)
    JS判断客户端是否是iOS或者Android手机移动端
    Web 通信 之 长连接、长轮询(long polling)
    jquery.fn.extend与jquery.extend(一)
    python 推导式
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/13300341.html
Copyright © 2011-2022 走看看