leetcode-950

这题用循环双端队列解。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值