1. 程式人生 > >LeetCode Week 13

LeetCode Week 13

950. Reveal Cards In Increasing Order

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:

Take the top card of the deck, reveal it, and take it out of the deck.
If there are still cards in the deck, put the next top card of the deck at the bottom of the deck.
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 <= A.length <= 1000
1 <= A[i] <= 10^6
A[i] != A[j] for all i != j

solutions:

本題意是給出一個數組(牌的數字),初始陣列中元素的順序不影響題意,而是我們對這個陣列中的元素進行重新排序,使重新排序後的陣列按照題目給出的步驟翻開牌,最終翻開牌上的數字是增序排列。

通過觀察題目翻開牌的方法,我們很容易得出最終輸出是一個增序陣列,我們可以通過輸出來反推輸入。輸出的第一位元素即是輸入的第一位,這時輸入的第二位放至隊尾,輸入的第三位是輸出的第二位。我們維持一個佇列q標識輸入的下標即可。

class Solution {
public:
    vector<int> deckRevealedIncreasing(vector<int>& deck) {
        sort(deck.begin(),deck.end());
        int ds=deck.size();
        queue<int> q;
        vector<int> ret(ds,-1);
        for(int i=0;i<ds;i++)
            q.push(i);
        for(int i=0;i<ds;i++)
        {
            int d1=q.front();
            ret[d1]=deck[i];
            q.pop();
            int d2=q.front();
            q.push(d2);
            q.pop();
        }
        return ret;
    }
};

在這裡插入圖片描述