LeetCode 5621. 無法吃午餐的學生數量(佇列模擬 / 不模擬)
阿新 • • 發佈:2020-12-30
技術標籤:LeetCode
文章目錄
1. 題目
學校的自助午餐提供圓形和方形的三明治,分別用數字 0 和 1 表示。
所有學生站在一個佇列裡,每個學生要麼喜歡圓形的要麼喜歡方形的。
餐廳裡三明治的數量與學生的數量相同。
所有三明治都放在一個 棧 裡,每一輪:
- 如果佇列最前面的學生 喜歡 棧頂的三明治,那麼會 拿走它 並離開佇列。
- 否則,這名學生會 放棄這個三明治 並回到佇列的尾部。
- 這個過程會一直持續到佇列裡所有學生都不喜歡棧頂的三明治為止。
給你兩個整數陣列 students 和 sandwiches ,其中 sandwiches[i] 是棧裡面第 i 個三明治的型別(i = 0 是棧的頂部), students[j] 是初始佇列裡第 j 名學生對三明治的喜好(j = 0 是佇列的最開始位置)。請你返回無法吃午餐
示例 1:
輸入:students = [1,1,0,0], sandwiches = [0,1,0,1]
輸出:0
解釋:
- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [1,0,0,1]。
- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [0,0,1,1]。
- 最前面的學生拿走最頂上的三明治,剩餘學生佇列為 students = [0,1,1],三明治棧為 sandwiches = [1,0,1]。
- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [1,1,0]。
- 最前面的學生拿走最頂上的三明治,剩餘學生佇列為 students = [1,0],三明治棧為 sandwiches = [0,1]。
- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [0,1]。
- 最前面的學生拿走最頂上的三明治,剩餘學生佇列為 students = [1],三明治棧為 sandwiches = [1]。
- 最前面的學生拿走最頂上的三明治,剩餘學生佇列為 students = [],三明治棧為 sandwiches = []。
所以所有學生都有三明治吃。
示例 2:
輸入:students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
輸出:3
提示:
1 <= students.length, sandwiches.length <= 100
students.length == sandwiches.length
sandwiches[i] 要麼是 0 ,要麼是 1 。
students[i] 要麼是 0 ,要麼是 1 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/number-of-students-unable-to-eat-lunch
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
2. 解題
- 模擬
class Solution {
public:
int countStudents(vector<int>& students, vector<int>& sandwiches) {
queue<int> q;
int n = students.size();
for(int i = 0; i < n; i++)
q.push(i);//排隊
int prevsize, cursize, i = 0;
while(1)
{
int k = q.size();
prevsize = q.size();//開始取餐,人數
while(k--)
{
int id = q.front();
q.pop();
if(students[id] == sandwiches[i])
{ //喜歡吃
i++;//餐被取走
}
else
{
q.push(id);//不喜歡吃,排到隊尾
}
}
cursize = q.size();
if(cursize == prevsize)//沒有人吃到午餐,結束
break;
}
return q.size();
}
};
8 ms 8.8 MB C++
- 不模擬做法
class Solution {
public:
int countStudents(vector<int>& students, vector<int>& sandwiches) {
queue<int> q;
int one = 0, zero = 0, n = students.size();
for(auto s : students)
{
if(s == 1)
one++;
else
zero++;
}//記錄兩種餐需求的同學數量
for(auto s : sandwiches)
{
if(s == 0)
{
if(zero)
zero--;
else
break;
}
else
{
if(one)
one--;
else
break;
}
} // 棧頂的餐,沒有同學可以拿走的時候,停止
return zero+one;
}
};
我的CSDN部落格地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!