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

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

2个月前 (05-26)

力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解 队列模拟 力扣1700题解 学生午餐问题 算法面试题解 LeetCode简单难度题 数据结构应用 贪心算法 队列操作技巧 数组模拟 编程题解 第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模拟


总结

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


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1022题:从根到叶的二进制数之和 - 递归解法详解

力扣1022题:从根到叶的二进制数之和 - 递归解法详解

内容简介本文详细解析了力扣第1022题"从根到叶的二进制数之和"的递归解法。通过深度优先遍历二叉树,累计每条路径表示的二进制数值,最终得到所有路径数值之和。这种方法时间复杂度为O(...

力扣面试03.04题:用栈实现队列 - 双栈解法详解

力扣面试03.04题:用栈实现队列 - 双栈解法详解

内容简介本文详细解析了力扣面试03.04题"用栈实现队列"的双栈解法。通过两个栈的巧妙配合,实现了队列的先进先出(FIFO)特性。文章包含完整注释代码、算法思路讲解和复杂度分析,帮...

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

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

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

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

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

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

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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