解题报告
最近的请求次数
题目链接:933. 最近的请求次数
解题思路
数组模拟队列,data为队列的长度,front队头,rear队尾。
每输入一个t,将t入队,若队头的值小于t - 3000,则队头一直出队,直到满足条件。最后返回尾指针减头指针的值。
解题代码
class RecentCounter {
int front, rear;
int data[10010];
public:
RecentCounter() {
front = 0;
rear = 0;
}
int ping(int t) {
data[rear ++ ] = t;
while(data[front] < t - 3000){
front ++ ;
}
return rear - front;
}
};
买票需要的时间
题目链接:2073. 买票需要的时间
解题思路
结构体定义队列每个人的位置和剩余票数,用数组模拟整个排队的过程,若位置为k且k的票数为0,直接返回答案,否则队头的人插入队尾。
解题代码
class Solution {
struct people{
int pos, ticket;
};
int front, rear;
people queue[10010];
public:
int timeRequiredToBuy(vector<int>& tickets, int k) {
int n = tickets.size();
front = rear = 0;
int ans = 0;
for(int i = 0; i < n; i ++ ){
queue[rear].pos = i;
queue[rear].ticket = tickets[i];
rear ++ ;
}
while(front < rear){
ans ++ ;
queue[front].ticket --;
if(queue[front].pos == k && queue[front].ticket == 0){
return ans;
}else if(queue[front].ticket == 0){
front ++ ;
}else{
queue[rear].pos = queue[front].pos;
queue[rear].ticket = queue[front].ticket;
rear ++ , front ++ ;
}
}
return -1;
}
};
设计循环双端队列
题目链接:641. 设计循环双端队列
解题思路
数组模拟双端队列,数组大小根据执行操作的最大数量应不小于4000,首尾指针从数组中间开始向两端走。
解题代码
class MyCircularDeque {
#define CENTER 2500;
int front, rear;
int cap;
int data[5000];
public:
MyCircularDeque(int k) {
cap = k;
front = CENTER;
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() {
if(rear - front + 1 == 0)
return true;
else
return false;
}
bool isFull() {
if(rear - front + 1 == cap)
return true;
else
return false;
}
};
设计前中后队列
题目链接:1670. 设计前中后队列
解题思路
解题代码