1. 程式人生 > 實用技巧 >503.下一個更大元素 II

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