题目来源于知识星球—英雄算法联盟,五月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、933.最近的请求次数(简单)
1.题目描述
2.解题思路
确保队列中的元素保持单调递增。每次调用ping函数时,如果队首元素和
队尾元素的差值超过3000,就不断弹出队首。
3.代码演示(C++)
class RecentCounter
{
int front;
int rear;
int data[10010];
public:
RecentCounter()
{
front=0;
rear=-1;
}
int ping(int t)
{
data[++rear]=t;
while(rear-front+1>0&&data[front]+3000<t)
{
front++;
}
return rear-front+1;
}
};
4.题目链接
二、2073.买票需要的时间(简单)
1.题目描述
2.解题思路
定义一个结构体,存储位置和剩余票数;不断模拟出队和入队的情况;
当出队的元素票数为空,则判断编号是否为k,若是则返回总共用去的
时间;票数不为空则继续入队。
3.代码演示(C++)
class Solution
{
struct People
{
int pos;
int ticket;
};
int front;
int rear;
People data[200000];
public:
int timeRequiredToBuy(vector<int>& tickets, int k)
{
int i;
int t=0;
front=rear=0;
for(i=0;i<tickets.size();i++)
{
People a;
a.pos=i;
a.ticket=tickets[i];
data[rear++]=a;
}
while(front<rear)
{
People p=data[front++];
t++;
--p.ticket;
if(p.ticket==0)
{
if(p.pos==k)
{
return t;
}
}
else
{
data[rear++]=p;
}
}
return -1;
}
};
4.题目链接
三、641.设计循环双端队列(中等)
1.题目描述
2.解题思路
执行次数不会超过2000次,所以声明一个元素个数为4000的数组,将初始化
的队首和队尾放在数组中间即可,防止数组下标越界。
3.代码演示(C++)
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;
}
};
4.题目链接
四、1670.设计前中后队列(中等)
1.题目描述
2.解题思路
暂时还不太会,以后常回来看看!
3.代码演示(C++)
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!