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

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

2个月前 (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模拟


总结

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


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1379题:找出克隆二叉树中的目标节点 - 递归解法详解

力扣1379题:找出克隆二叉树中的目标节点 - 递归解法详解

内容简介本文详细解析了力扣第1379题"找出克隆二叉树中的目标节点"的递归解法。通过深度优先搜索遍历克隆树,找到与原始树目标节点值相同的节点。这种方法时间复杂度为O(n),是理解二...

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

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

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

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

一、题目解读牛客13256题要求处理一组题目难度数据,通过组合三元组(难度差≤20)或二元组(难度差≤10)来重新编排题目,计算需要补充的最小题目数量。题目本质是资源分配与优化问题,需高效组合现有题目...

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

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

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

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

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

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

力扣1643题:第K小字典序路径(附C++代码与解题思路)

力扣1643题:第K小字典序路径(附C++代码与解题思路)

一、题目解读本题要求生成从原点(0, 0)到目标坐标(destination[0], destination[1])的路径中,字典序第K小的路径。路径仅由向下字符'V'(代表垂直移动)...

发表评论

访客

看不清,换一张

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