Re: [閒聊] leetcode 大師請進已回收

看板Marginalman作者 (麵包屌)時間1年前 (2024/05/06 22:52), 1年前編輯推噓0(005)
留言5則, 3人參與, 1年前最新討論串3/8 (看更多)
※ 引述《Rushia (早瀬ユウカの体操服 )》之銘言: : 1.先把陣列分成兩堆,遞增的記住他們的索引變一個單調堆疊,非遞增的記住他們的值。 : 2.把非遞增的值排序。 : 3.從最大數字x開始處理非遞增的值,如果stack頂端大於x就把頂端元素pop,如果比較小 : 就表示要插到頂端的右邊,如果單調堆疊已經空就插到0,因為是從大的元素開始插入 : 所以右邊的索引變怎樣就不用管了。 : py code : ------------------------------------------- : def min_actions(arr): : res = [] : s = [] : ls = [] : for i in range(len(arr)): : if not s or arr[s[-1]] < arr[i]: : s.append(i) : else: : ls.append(arr[i]) 這裡一般要維護 monotonic stack 的話應該是要在嘗試 s.append(i) 的時候 pop while s and arr[s[-1]] < arr[i]: del s[-1] s.append(i) 你這樣的寫法就只有找到第一個遞增 subsequence 而已 不一定會是最長的 像是 [1,7,9,2,3,4] 的話 會找到 s = [1,7,9], ls = [2,3,4] : ls.sort() : while ls: : while s and arr[s[-1]] > ls[-1]: : s.pop() : x = ls.pop() : if not s: : res.append((0, x)) : else: : res.append((s[-1] + 1, x)) : return res : ------------------------------------------- : 我亂寫的 那兩個測資有過 複雜度是O(nlogn) 可能有bug 對不起 所以這題應該是要先找 longest increasing subsequence (LIS) 確保更改順序的元素量最小 然後找 LIS 和 monotonic stack 應該也沒有關係 monotonic stack 通常是拿來找每個元素往前第一個比自己大/小的元素在哪 LIS 在這 https://leetcode.com/problems/longest-increasing-subsequence/ 不過只有找長度 討論區有記 path 找到實際 LIS 的版本 也是 O(nlog(n)) -- 蛤? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.140.99 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1715007154.A.FDD.html

05/06 22:53, 1年前 , 1F
把s換成LIS應該就沒BUG了...吧?
05/06 22:53, 1F

05/06 22:54, 1年前 , 2F
這題不是要找長度是要找前面的索引
05/06 22:54, 2F

05/06 22:58, 1年前 , 3F
我說我貼那題只有找長度而已 要找實際的LIS可以翻討論區
05/06 22:58, 3F
※ 編輯: pandix (1.164.140.99 臺灣), 05/06/2024 23:03:49

05/06 23:03, 1年前 , 4F
有其他BUG 好苦
05/06 23:03, 4F

05/06 23:04, 1年前 , 5F
沒有測資讓大家除錯 XD
05/06 23:04, 5F
文章代碼(AID): #1cEEwo_T (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1cEEwo_T (Marginalman)