Re: [閒聊] 每日LeetCode已回收

看板Marginalman作者 (みけねこ的鼻屎)時間3年前 (2022/11/09 10:55), 3年前編輯推噓3(305)
留言8則, 3人參與, 3年前最新討論串93/719 (看更多)
901. Online Stock Span 其實我看不太懂題目在工殺小(也不想知道),總之我們要設計一個類別,每次可以對該 類別offer一個整數,你要返回該整數插入位置往前算共有幾個小於等於他的連續數字( 包括他自己)。 Example: Input ["StockSpanner", "next", "next", "next", "next", "next", "next", "next"] [[], [100], [80], [60], [70], [60], [75], [85]] Output [null, 1, 1, 1, 2, 1, 4, 6] Explanation StockSpanner stockSpanner = new StockSpanner(); stockSpanner.next(100); // return 1 stockSpanner.next(80); // return 1 stockSpanner.next(60); // return 1 stockSpanner.next(70); // return 2 [100 80 60 70] stockSpanner.next(60); // return 1 stockSpanner.next(75); // return 4 [100 80 60 70 60 75] stockSpanner.next(85); // return 6 思路: 1.因為要從當前位置往前檢查,要記錄之前的結果,所以直覺的想到用 stack 做。 2.總之就把當前的數字與頂端比較,如果小於頂端就返回1,否則不斷的從頂端取出 元素直到不能再取,過程不斷的+1 Java Code: -------------------------------------------- class StockSpanner { private Stack<Integer> stack; private Stack<Integer> tmp; public StockSpanner() { stack = new Stack<>(); tmp = new Stack<>(); } public int next(int price) { int count = 1; while (!stack.isEmpty() && stack.peek() <= price) { tmp.push(stack.pop()); count++; } while (!tmp.isEmpty()) { stack.push(tmp.pop()); } stack.push(price); return count; } } --------------------------------------------- 3.好喔 但是直接做的結果吃了TLE 那就只能想辦法改良了 4.其實取出來的元素沒必要塞回去,我們改用一個pair來儲存上次這個點往前 查找的結果,陣列[0]表示價錢[1]表示有幾個,這樣每次查詢查出來的都是 一個區間了 Java Code: --------------------------------------------- class StockSpanner { private Stack<int[]> stack; public StockSpanner() { stack = new Stack<>(); } public int next(int price) { int count = 1; while (!stack.isEmpty() && stack.peek()[0] <= price) { count += stack.peek()[1]; stack.pop(); } stack.push(new int[] {price, count}); return count; } } --------------------------------------------- 大guy是這樣 -- https://i.imgur.com/fHpKflu.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.66.39 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1667962544.A.EB2.html

11/09 10:58, 3年前 , 1F
大師
11/09 10:58, 1F

11/09 11:03, 3年前 , 2F
大師
11/09 11:03, 2F

11/09 11:04, 3年前 , 3F
不用stack吧,你直接比前一個輸入不就好了
11/09 11:04, 3F
不用STACK你怎麼解這種case= = [28 14 28 35] 頂多用List 因為他每call一次next才插入一個元素所以不太想用陣列

11/09 11:06, 3年前 , 4F
大於前一個輸入就輸出++count
11/09 11:06, 4F

11/09 11:06, 3年前 , 5F
小於就輸出1,count=1
11/09 11:06, 5F
28 14 28 35 1 1 2 3 可是答案是4 謝謝 謝謝喔

11/09 11:07, 3年前 , 6F
還是你是要輸出一個矩陣
11/09 11:07, 6F

11/09 11:09, 3年前 , 7F
++count啦,我太久沒寫Java,寫成C的寫法= =
11/09 11:09, 7F
兩個又沒有差 28 14 28 35 1 1 2 3 (小於輸出1) (小於輸出1) (++count = 2) (++count = 3)

11/09 11:11, 3年前 , 8F
喔,我眼殘,抱歉= =
11/09 11:11, 8F
※ 編輯: Rushia (1.160.66.39 臺灣), 11/09/2022 11:14:19
文章代碼(AID): #1ZQnQmwo (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1ZQnQmwo (Marginalman)