LC.1700 | 无法吃午餐的学生数量 | 队列 | 计数模拟

输入:两个长度相等的整数数组 studentssandwichesstudents 表示学生的喜好,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;
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值