当前位置:首页 > 力扣 > 力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解

力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解

3个月前 (05-26)

力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解  算法面试题解 贪心算法 队列操作技巧 数组模拟 第1张

内容简介

本文详细解析了力扣1700题"无法吃午餐的学生数量"的队列模拟解法。通过模拟学生排队取餐的过程,统计无法吃到喜欢三明治的学生数量。文章包含完整注释代码、算法思路讲解和复杂度分析,帮助读者掌握队列模拟问题的解决技巧。


算法思路

‌1.队列模拟‌:使用双指针模拟学生队列和三明治

‌2.匹配处理‌:当学生偏好与栈顶三明治匹配时,两者都出队

‌3.不匹配处理‌:不匹配时学生重新排到队尾

‌4.终止条件‌:当一轮遍历没有学生能吃到三明治时结束


代码实现(带详细注释)

class Solution {
public:
    int countStudents(vector<int>& students, vector<int>& sandwiches) {
        int front = 0;          // 学生队列头部指针
        int rear = students.size() - 1; // 学生队列尾部指针(初始位置)
        int top = 0;            // 三明治栈顶指针
        int stu_num = students.size(); // 剩余学生数量
        
        int num = stu_num;      // 当前轮次待处理学生数

        while(num != 0) {       // 当还有学生需要处理时循环
            if(students[front] == sandwiches[top]) { // 学生偏好匹配栈顶三明治
                front++;        // 学生出队
                top++;          // 三明治出栈
                stu_num--;      // 剩余学生数减1
                num = stu_num;  // 重置待处理学生数
            }
            else {              // 不匹配情况
                students.push_back(students[front]); // 学生排到队尾
                front++;        // 移动队首指针
                num--;          // 待处理学生数减1
            }
        }
        return stu_num;         // 返回无法就餐的学生数
    }
};

复杂度分析

‌时间复杂度‌:O(n^2),最坏情况下每个学生需要遍历整个队列

‌空间复杂度‌:O(1),仅使用常数个额外空间


优化方向

‌计数优化‌:统计学生偏好数量,提前判断无法分配的情况

‌提前终止‌:当剩余学生都偏好同一种三明治且栈顶不是该类型时提前终止

队列优化‌:使用标准队列容器替代vector模拟


总结

队列模拟是解决此类学生-三明治匹配问题的有效方法,通过模拟实际排队过程可以直观地统计无法就餐的学生数量。理解这种解法有助于掌握队列数据结构的应用场景和模拟类问题的解决思路。


原创内容 转载请注明出处

分享给朋友:

相关文章

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

一、题目解读牛客13271题要求从给定的数字字符串中删除K个数字,使得剩余数字按原顺序排列后得到的最小数。题目核心在于如何在保持数字相对顺序的前提下,通过删除操作得到最优解。需注意结果字符串可能包含前...

力扣226题:翻转二叉树 - 递归解法详解

力扣226题:翻转二叉树 - 递归解法详解

内容简介本文详细解析了力扣226题"翻转二叉树"的递归解法。通过递归遍历二叉树的每个节点并交换其左右子树,实现了二叉树的完全翻转。文章包含完整注释代码、算法思路讲解和复杂度分析,帮...

GESP五级题巧夺大奖解题报告:贪心算法优化与代码实现(洛谷B3872)

GESP五级题巧夺大奖解题报告:贪心算法优化与代码实现(洛谷B3872)

一、题目解读2023年GESP五级题目“巧夺大奖”(洛谷B3872)是一个经典的资源分配问题。题目要求玩家在有限时间内选择多个游戏,每个游戏有截止时间和奖励值,需在截止时间前完成游戏以获得奖励。目标是...

洛谷P12597题解:子序列查找的贪心与二分优化详解

洛谷P12597题解:子序列查找的贪心与二分优化详解

一、题目解读洛谷P12597题目要求在一个字符串s中寻找最长的子序列,该子序列需满足字符顺序与另一个字符串t相同。题目强调子序列无需连续,但字符相对位置需保持一致。例如,若t为"abc&qu...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。