【力扣】950:按遞增順序顯示卡牌

題目描述

牌組中的每張卡牌都對應有一個唯一的整數。你可以按你想要的順序對這套卡片進行排序。

最初,這些卡牌在牌組裏是正面朝下的(即,未顯示狀態)。

現在,重複執行以下步驟,直到顯示所有卡牌爲止:

從牌組頂部抽一張牌,顯示它,然後將其從牌組中移出。
如果牌組中仍有牌,則將下一張處於牌組頂部的牌放在牌組的底部。
如果仍有未顯示的牌,那麼返回步驟 1。否則,停止行動。
返回能以遞增順序顯示卡牌的牌組順序。

答案中的第一張牌被認爲處於牌堆頂部。

輸入:[17,13,11,2,3,5,7]
輸出:[2,13,3,11,5,17,7]
解釋:
我們得到的牌組順序爲 [17,13,11,2,3,5,7](這個順序不重要),然後將其重新排序。
重新排序後,牌組以 [2,13,3,11,5,17,7] 開始,其中 2 位於牌組的頂部。
我們顯示 2,然後將 13 移到底部。牌組現在是 [3,11,5,17,7,13]。
我們顯示 3,並將 11 移到底部。牌組現在是 [5,17,7,13,11]。
我們顯示 5,然後將 17 移到底部。牌組現在是 [7,13,11,17]。
我們顯示 7,並將 13 移到底部。牌組現在是 [11,17,13]。
我們顯示 11,然後將 17 移到底部。牌組現在是 [13,17]。
我們展示 13,然後將 17 移到底部。牌組現在是 [17]。
我們顯示 17。
由於所有卡片都是按遞增順序排列顯示的,所以答案是正確的。

算法思路

由示例反向思考,先向數組res數組頭放入17,然後pop出末尾,放到數組頭,此時[17]
向數組res數組頭放入13,然後pop出末尾,放到數組頭,[17,13]
向數組res數組頭放入11,然後pop出末尾,放到數組頭,[13,11,17]
向數組res數組頭放入7,然後pop出末尾,放到數組頭,[17,7,13,11]
向數組res數組頭放入5,然後pop出末尾,放到數組頭,[11,5,17,7,13]
向數組res數組頭放入3,然後pop出末尾,放到數組頭,[13,3,11,5,17,7]
向數組res數組頭放入2,此時:[2,13,3,11,5,17,7]即是輸出值。

!有一個小點,直接使用列表來進行操作,速度上不太理想,如果使用雙端列表,所有的操作時間複雜度就都是O(1)。

class Solution:
    def deckRevealedIncreasing(self, deck: List[int]) -> List[int]:
        res=deque()
        deck.sort()
        while deck:
            res.appendleft(deck.pop())
            if not deck:break
            res.appendleft(res.pop())
        return res

執行用時 :52 ms, 在所有 Python3 提交中擊敗了81.07%的用戶
內存消耗 :13.8 MB, 在所有 Python3 提交中擊敗了100.00%的用戶

使用列表和雙端列表的對比:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章