503.下一個更大元素 II
阿新 • • 發佈:2020-07-14
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; };