文章目录
一、933. 最近的请求次数
1.原题链接
2.题目描述
写一个 RecentCounter 类来计算特定时间范围内最近的请求。
3.解题思路
队列
4.源码
class RecentCounter {
public:
/* 定义队列 */
queue<int> que;
RecentCounter() {
}
int ping(int t) {
que.push(t);
/* 队首元素的值在[t - 3000, t]内结束循环 */
while (que.front() < t - 3000)
que.pop();
return que.size();
}
};
二、2073. 买票需要的时间
1.原题链接
2.题目描述
有 n 个人前来排队买票,其中第 0 人站在队伍 最前方 ,第 (n - 1) 人站在队伍 最后方 。给你一个下标从 0 开始的整数数组 tickets ,数组长度为 n ,其中第 i 人想要购买的票数为 tickets[i] 。每个人买票都需要用掉 恰好 1 秒 。一个人 一次只能买一张票 ,如果需要购买更多票,他必须走到 队尾 重新排队(瞬间 发生,不计时间)。如果一个人没有剩下需要买的票,那他将会 离开 队伍。返回位于位置 k(下标从 0 开始)的人完成买票需要的时间(以秒为单位)。
3.解题思路
队列模拟
4.源码
class Solution {
public:
int timeRequiredToBuy(vector<int>& tickets, int k) {
unordered_map<int, int>mp;
queue<int> que;
int res = 0;
for(int i = 0; i < tickets.size(); ++i) {
mp[i] = tickets[i];
que.push(i);
}
while(mp[k] > 0) {
int id = que.front();
que.pop();
mp[id]--;
if(mp[id] > 0) que.push(id);
++res;
}
return res;
}
};
三、641. 设计循环双端队列
1.原题链接
2.题目描述
设计实现双端队列。
3.解题思路
双端队列模拟
4.源码
class MyCircularDeque {
#define CENTER 2500
int data[5000];
int cap;
int front,rear;
public:
MyCircularDeque(int k) {
cap=k;
front=CENTER;
rear=front-1;
}
int getCount(){
return rear-front+1;
}
bool insertFront(int value) {
if(isFull()){
return false;
}
data[--front]= value;
return true;
}
bool insertLast(int value) {
if(isFull()){
return false;
}
data[++rear]= value;
return true;
}
bool deleteFront() {
if(isEmpty()){
return false;
}
++front;
return true;
}
bool deleteLast() {
if(isEmpty()){
return false;
}
--rear;
return true;
}
int getFront() {
if(isEmpty()){
return -1;
}
return data[front];
}
int getRear() {
if(isEmpty()){
return -1;
}
return data[rear];
}
bool isEmpty() {
return getCount()==0;
}
bool isFull() {
return getCount()==cap;
}
};
四、1670. 设计前中后队列
1.原题链接
2.题目描述
请你设计一个队列,支持在前,中,后三个位置的 push 和 pop 操作。
3.解题思路
双端队列加模拟
4.源码
class FrontMiddleBackQueue {
#define CENTER 2500
int data[5000];
int front,rear;
public:
FrontMiddleBackQueue() {
front=CENTER;
rear=front-1;
}
int getCount(){
return rear-front+1;
}
void pushFront(int val) {
data[--front]=val;
}
void pushMiddle(int val) {
if(getCount()==1){
pushFront(val);
return ;
}
int x =getCount();
int y =front+x/2;
for(int i=rear+1;i>y;--i){
data[i]=data[i-1];
}
data[y]=val;
++rear;
};
void pushBack(int val) {
data[++rear]=val;
}
int popFront() {
if(getCount()==0){
return -1;
}
return data[front++];
}
int popMiddle() {
if(getCount()==0){
return -1;
}
int x =getCount();
int y = front+(x-1)/2;
int tmp=data[y];
for(int i=y;i<rear;++i){
data[i]=data[i+1];
}
--rear;
return tmp;
}
int popBack() {
if(getCount()==0){
return -1;
}
return data[rear--];
}
};
总结
十六天,双端队列还要多加思考。