Re: [閒聊] 每日LeetCode已回收
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
11/09 11:04, 3F
不用STACK你怎麼解這種case= =
[28 14 28 35]
頂多用List 因為他每call一次next才插入一個元素所以不太想用陣列
→
11/09 11:06,
3年前
, 4F
11/09 11:06, 4F
→
11/09 11:06,
3年前
, 5F
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
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
討論串 (同標題文章)
完整討論串 (本文為第 93 之 719 篇):