题目描述
桌子上有一副牌(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 <= A.length <= 1000
1 <= A[i] <= 10^6
A[i] != A[j]
for alli != 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;
}
};
测试