• wy的leetcode刷题记录_Day16


    wy的leetcode刷题记录_Day16

    1700. 无法吃午餐的学生数量

    今天的每日一题是:1700. 无法吃午餐的学生数量

    题目介绍

    学校的自助午餐提供圆形和方形的三明治,分别用数字 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和喜欢0的个数,每拿走一个栈顶的食物,相应的学生队列喜欢食物的变量就要更新,直道其中一个为0或者食物拿完了,剩下的就是没有喜欢的吃的食物的学生。

    代码

    class Solution {
    public:
        int countStudents(vector<int>& students, vector<int>& sandwiches) {
            int n1=accumulate(students.begin(),students.end(),0);
            int n0=students.size()-n1;
            for(auto sandwiche:sandwiches)
            {
                if(sandwiche==0)
                {
                    if(n0==0)
                        break;
                    n0--;
                }
    
                if(sandwiche==1)
                {
                    if(n1==0)
                        break;
                    n1--;
    
                }
    
                if(n0==0&&n1==0)
                {
                    return n0+n1;
                }   
            }
            return n0+n1;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    收获

    简单的模拟题,读懂题意后可以很轻松的做出来。

    123. 买卖股票的最佳时机 III

    123. 买卖股票的最佳时机 III

    题目介绍

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
    设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例 1:
    输入:prices = [3,3,5,0,0,3,1,4]
    输出:6
    解释:在第 4 天(股票价格 = 0)的时候买入,在第 6天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。

    示例 2:
    输入:prices = [1,2,3,4,5]
    输出:4
    解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 =5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

    思路

    这道题比II增加了一个条件也就是可以最多购买俩次所得到的最大利益,所以有五种状态:1.第一次购买前。2.第一次购买后。3.第一次卖出后。4.第二次购买后。5.第二次卖出后。第一次购买前为0就不计入考虑,题目说不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票),有一种情况就是第一天买入第一天卖出然后再买入卖出,这样的话也算俩次操作,于是我们使用四个临时变量来记录四个状态的值,遍历思路:第一次购买后肯定是-当天的股价,第一次卖出后肯定是第一次购买后的财产加上当天的股价,而第二次购买后是基于第一次卖出后的财产-当天股价,第二次卖出后是第二次购买后的财产+当天股价,通过每次遍历得到相应的最大值,最后得到第二次卖出后的最大利益。

    代码

    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int buy1=-prices[0];
            int sale1=0;
            int buy2=-prices[0];
            int sale2=0;
            int n=prices.size();
            for(int i=1;i<n;i++)
            {
                buy1=max(buy1,-prices[i]);
                sale1=max(sale1,buy1+prices[i]);
                buy2=max(buy2,sale1-prices[i]);
                sale2=max(sale2,buy2+prices[i]);
            }
            return sale2;
    
    
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    收获

    也算动态规划的一种但是更省空间,也称为滚动数组。

  • 相关阅读:
    PHP array_combine() 函数
    golang关于数量的总结
    在 vue-cli 构建的项目中配置使用资源CDN,加速我们的项目
    【android 蓝牙开发——蓝牙耳机】
    数据结构刷题——dfs
    java开发中postgresql数组字段类型处理
    MySQL权限
    打破数据孤岛!时序数据库 TDengine 与创意物联感知平台完成兼容性互认
    计算机考研 | 2020年 | 计算机组成原理真题
    服务器为什么会丢包
  • 原文地址:https://blog.csdn.net/m0_54015435/article/details/127413996