输入:两个长度相等的整数数组 students 和 sandwiches。students 表示学生的喜好,sandwiches 表示三明治的类型。数组元素 0 和 1 代表两种不同类型。
要求:学生排成一个队列,三明治堆成一个栈。学生从队首取三明治,三明治从栈顶取出。
-
如果学生喜欢栈顶三明治,他会拿走并离开队列。
-
如果学生不喜欢栈顶三明治,他会放回三明治,并回到队列尾部。 当队列中的所有学生都不喜欢栈顶三明治时,过程停止。 返回无法吃午餐的学生数量。
输出:一个整数,表示无法吃午餐的学生数量。
思路:因为students队列是不断循环的,所以只要能取餐就一定会循环到,根本不需要考虑students里的顺序,直接计数统计喜欢1和喜欢0的人数。
按照 sandwiches 栈的顺序(从前向后)遍历三明治:
-
如果栈顶三明治是 0,且有喜欢 0 的学生 (
count0 > 0),则学生拿走,count0减 1。 -
如果栈顶三明治是 0,但没有喜欢 0 的学生 (
count0 == 0),则过程停止。此时剩下的count1个学生都吃不上饭。 -
三明治类型为 1 的情况同理。
复杂度:
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int countStudents(vector<int>& students, vector<int>& sandwiches) {
//直接硬模拟啊
//写个while 1 设置一个终止判定 当1元素等于len 且 三明治栈顶为0 或者 0元素数量等于len 且 三明治栈顶为1 或者 len为0 终止
//又或者
//因为是不断循环取的 所以实际上也不用模拟栈 直接数量进行模拟即可
//sandwiches数组进队列 然后students数组遍历 得到count1 count0 sandwiches出队列
//出一个0 或者 1 对应的count1 或者 0减1 当然 0 1不够减的时候 剩下的count1或者count0就是吃不上饭的
queue<int> q;
int count1 = 0;
int count0 = 0;
for (int sand:sandwiches) {
q.push(sand);
}
for (int stu:students) {
if (stu == 1) {
count1++;
}
else {
count0++;
}
}
while (!q.empty()) {
if (q.front() == 0) {
if (count0 > 0) {
q.pop();
count0--;
}
else {
return count1;
}
}
else {
if (count1 > 0) {
q.pop();
count1--;
}
else {
return count0;
}
}
}
return 0;
}
};

被折叠的 条评论
为什么被折叠?



