1. 程式人生 > 其它 >LeetCode 5621. 無法吃午餐的學生數量(佇列模擬 / 不模擬)

LeetCode 5621. 無法吃午餐的學生數量(佇列模擬 / 不模擬)

技術標籤: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阿明),一起加油、一起學習進步!
Michael阿明