【LeetCode】950. Reveal Cards In Increasing Order 解题报告(Python)

本文介绍了一种解决LeetCode题目“按递增顺序展示牌”的方法,采用模拟策略,利用链表高效实现牌的翻转与排序。详细解析了算法步骤,包括将最大值置顶并调整链表结构,确保最终牌面顺序符合题目要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/reveal-cards-in-increasing-order/description/

题目描述

In a deck of cards, every card has a unique integer. You can order the deck in any order you want.

Initially, all the cards start face down (unrevealed) in one deck.

Now, you do the following steps repeatedly, until all cards are revealed:

1, Take the top card of the deck, reveal it, and take it out of the deck.

  1. If there are still cards in the deck, put the next top card of the deck at the bottom of the deck.
  2. If there are still unrevealed cards, go back to step 1. Otherwise, stop.

Return an ordering of the deck that would reveal the cards in increasing order.

The first entry in the answer is considered to be the top of the deck.

Example 1:

Input: [17,13,11,2,3,5,7]
Output: [2,13,3,11,5,17,7]
Explanation: 
We get the deck in the order [17,13,11,2,3,5,7] (this order doesn't matter), and reorder it.
After reordering, the deck starts as [2,13,3,11,5,17,7], where 2 is the top of the deck.
We reveal 2, and move 13 to the bottom.  The deck is now [3,11,5,17,7,13].
We reveal 3, and move 11 to the bottom.  The deck is now [5,17,7,13,11].
We reveal 5, and move 17 to the bottom.  The deck is now [7,13,11,17].
We reveal 7, and move 13 to the bottom.  The deck is now [11,17,13].
We reveal 11, and move 17 to the bottom.  The deck is now [13,17].
We reveal 13, and move 17 to the bottom.  The deck is now [17].
We reveal 17.
Since all the cards revealed are in increasing order, the answer is correct.

Note:

  1. 1 <= A.length <= 1000
  2. 1 <= A[i] <= 10^6
  3. A[i] != A[j] for all i != j

题目大意

对一堆面朝下的牌进行如下操作:

  1. 把最上面的牌翻开
  2. 如果还有牌,把最上面的牌放到最下面
  3. 如果还有牌,重复1和2

问初始状况如何排列牌,才能使得翻开牌的顺序是有序的。

解题方法

模拟

这个世界太有意思了,看似超级困难的游戏,在计算机的帮助下,很快就能求解。但这也是对程序设计的一个挑战。

我最初的想法是进行模拟,但是我想到的是用list模拟,那么每次插入操作很费时,应该不能通过,所以我就去找规律去了!惭愧啊!

正确的方法是使用链表!因为链表在前后进行插入删除的时间复杂度都是O(1),所以比list强多了。

使用链表的话,我们需要把整个的顺序倒着看,也就是说把题目给出的翻牌的顺序从下向上看。那么我们得出了规律:

第一步,先把最大的数字放入链表里;

第二步,每次把剩余的最大值放到链表的开头,同时把链表的最后一个元素放入到链表最前面。

只要还有剩余数字,重复第一和第二步。

python的代码其实很简单。

class Solution(object):
    def deckRevealedIncreasing(self, deck):
        """
        :type deck: List[int]
        :rtype: List[int]
        """
        deck.sort()
        N = len(deck)
        res = [0] * N
        que = collections.deque()
        for i in range(N):
            if que:
                que.appendleft(que.pop())
            que.appendleft(deck.pop())
        return list(que)

日期

2018 年 12 月 2 日 —— 又到了周日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值