这题用循环双端队列解。
class MyCircularDeque {
public:
MyCircularDeque(int k) {
m_iCapacity = k;
queue = new int[m_iCapacity];
m_iSize = 0;
front = 0;
rear = 0;
}
~MyCircularDeque()
{
delete[]queue;
queue = NULL;
}
bool insertFront(int value) {
if (isFull()) return false;
front = (front + m_iCapacity - 1) % m_iCapacity;
queue[front] = value;
m_iSize++;
return true;
}
bool insertLast(int value) {
if (isFull()) return false;
queue[rear] = value;
rear++;
rear = rear%m_iCapacity;
m_iSize++;
return true;
}
bool deleteFront() {
if (isEmpty()) return false;
front++;
front = front % m_iCapacity;
m_iSize--;
return true;
}
bool deleteLast() {
if (isEmpty()) return false;
rear = (rear + m_iCapacity - 1) % m_iCapacity;
m_iSize--;
return true;
}
int getFront() {
if (isEmpty()) return -1;
return queue[front];
}
int getRear() {
if (isEmpty()) return -1;
int tmp = rear;
tmp = (tmp + m_iCapacity - 1) % m_iCapacity;
return queue[tmp];
}
bool isEmpty() {
if (m_iSize == 0) return true;
return false;
}
bool isFull() {
if (m_iSize == m_iCapacity) return true;
return false;
}
vector<int> arrToVector(){
vector<int> res;
for (int i = front; i < front + m_iSize; i++){
//cout << queue[i%m_iCapacity] << ",";
res.push_back(queue[i%m_iCapacity]);
}
return res;
}
void traverse(){
for (int i = front; i < front + m_iSize; i++){
cout << queue[i%m_iCapacity] << ",";
}
}
private:
int m_iCapacity;
int m_iSize;
int front;//队列头位置
int rear;//队列尾位置
int *queue;
};
bool cmp(int a, int b){
return a > b;
}
vector<int> deckRevealedIncreasing(vector<int>& deck) {
vector<int> res;
if (deck.size() == 1) return deck;
if (deck.size() == 2){
res.push_back(min(deck[0], deck[1]));
res.push_back(max(deck[0], deck[1]));
return res;
}
//从大到小排序
sort(deck.begin(), deck.end(), cmp);
if (deck.size() == 3){
res.push_back(deck[2]);
res.push_back(deck[0]);
res.push_back(deck[1]);
return res;
}
MyCircularDeque que(deck.size());
que.insertLast(deck[0]);
que.insertLast(deck[1]);
que.insertFront(deck[2]);
//que.traverse();
for (int i = 3; i < deck.size(); i++){
//将队尾的元素出队,再拿到队头
int rear = que.getRear();
que.deleteLast();
que.insertFront(rear);
//加入新元素到队头
int tmp = deck[i];
que.insertFront(tmp);
}
//que.traverse();
res=que.arrToVector();
return res;
}
int main(){
//[17,13,11,2,3,5,7]
vector<int> vec;
vec.push_back(17);
vec.push_back(13);
vec.push_back(11);
vec.push_back(2);
vec.push_back(3);
vec.push_back(5);
vec.push_back(7);
vector<int> res = deckRevealedIncreasing(vec);
cout << res[0] << endl;
system("pause");
return 0;
}