Leetcode【950】--Reveal Cards In Increasing Order按递增顺序显示牌【Array】【Medium】【C++】

题目描述

桌子上有一副牌(a deck of cards),面朝下扣着,翻开第一张,然后拿走,并且把其后的一张牌放到这副牌的最下面,以此类推,直到把所有牌都翻开。求这副牌开始应该以什么顺序放,可以保证把所有牌翻开后,是按递增顺序的。

示例

Input: [17,13,11,2,3,5,7]
Output: [2,13,3,11,5,17,7]

解释

我们把牌按顺序排列[17 13 11 2 3 5 7](这个顺序不重要),然后重新排序。重新排序后,deck开始为[2,13,3,11,5,17,7],其中2是deck的顶部。

翻开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

直到翻开所有牌是按递增顺序的,输出答案是正确的。

注意

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

思路

先将数组按从小到大的顺序排好序,定义一个队列,由于队列是先进后出的,利用队列的这个特点,将数组奇偶数位置的数分别存放较大数和较小数,这样就可以满足题目要求。

代码

class Solution {
public:
    vector<int> deckRevealedIncreasing(vector<int>& deck) {
        sort(deck.begin(),deck.end()); //sort(begin,end,cmp),cmp参数可以没有,如果没有 
//默认非降序排序,排序方法是类似于快排,第一个是要排序的数组的起始地址,第二个是结束的地址,第三个参 
//数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到 
//大排序
        int ds=deck.size();
        queue<int> q;
        vector<int> ret(ds,-1);//定义一个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;
    }
};

测试

猜你喜欢

转载自blog.csdn.net/weixin_42702666/article/details/88202570
今日推荐