题目来源于知识星球—英雄算法联盟,六月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、933.最近的请求次数(简单)
1.题目描述
2.解题思路
声明一个队列,将时间t插入到队列中,每次插入时判断和队首的元素差值
如果超过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.题目链接
二、1700.无法吃午餐的学生数量(简单)
1.题目描述
2.解题思路
学生位置可变,三明治位置不可变。先统计学生中对两种三明治的需求人数,
之后遍历三明治数组,如果栈顶的三明治还有对应的学生,那么该三明治一定
会被拿走,否则之后所有的三明治都无法在被拿走,输出剩下的学生数目,即
无法拿走午餐的学生数目。
3.代码演示(C++)
class Solution
{
public:
int countStudents(vector<int>& students, vector<int>& sandwiches)
{
int num0=0;
int num1=0;
for(auto student:students)
{
if(student)
{
num1++;
}
else
{
num0++;
}
}
for(auto sandwich:sandwiches)
{
if(sandwich&&num1)
{
num1--;
}
else if(!sandwich&&num0)
{
num0--;
}
else
{
break;
}
}
return num0+num1;
}
};
4.题目链接
三、2073.买票需要的时间(简单)
1.题目描述
2.解题思路
1.定义一个结构体,存储位置和剩余票数;
2.不断模拟出队和入队的情况;
3.当出队的元素票数为空,则判断编号是否为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.题目链接
四、239.滑动窗口最大值(困难)
1.题目描述
2.解题思路
又到了困难题了,下次再战吧还是!
3.代码演示(C++)
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!