最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • LeetCode135.分发糖果 | 刷题打卡

    正文概述 掘金(_清水)   2021-03-06   484

    前言

        LeetCode刷了忘,忘了再刷又忘???
    

    LeetCode135.分发糖果 | 刷题打卡

        没错这说的正是在下,学算法还是要自己写题解、写分享、多总结多回顾啊(顶不住了)
        
    

    题目描述 LeetCode135.分发糖果

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。

    你需要按照以下要求,帮助老师给这些孩子分发糖果:

    1. 每个孩子至少分配到 1 个糖果。
    2. 评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。

    那么这样下来,老师至少需要准备多少颗糖果呢?

    示例 1:
    输入:[1,0,2] 
    输出:5 
    解释:你可以分别给这三个孩子分发 2、1、2 颗糖果。
    
    示例 2:
    输入:[1,2,2]
    输出:4
    解释:你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
    

    思路分析

    • 每个人至少有一个糖果,先建个数组初始化为1,每个孩子都分配一个糖果
        let nums = new Array(ratings.length).fill(1);
    
    • 第一次 从左往右遍历,若右边的评分比左边的高,则右边的糖果数改为左边的糖果数加 1
    	for(let i = 1 ; i < ratings.length; i++){
    	    if(ratings[i] > ratings[i-1]){
    	        nums[i] = nums[i-1] +1;
    	        }
    	}
    
    • 从右往左遍历,左边的评分比右边的高,且左边孩子当前的糖果数不大于右边的糖果数,则左边的糖果数更新为右边的糖果数加 1
        for(let j = ratings.length - 1; j > 0; j--){
            if (ratings[j] < ratings[j-1] && nums[j-1] <= nums[j]) {
                nums[j-1] = nums[j] + 1;
            }
        }
    

    代码

    const candy =(ratings) => {
        // 每个人先分配一个
        let nums = new Array(ratings.length).fill(1);
         // 从左往右
        for(let i = 1 ; i < ratings.length; i++){
            if(ratings[i] > ratings[i-1]){
                nums[i] = nums[i-1] +1;
            }
        }
        // 从右往左 
        for(let j = ratings.length - 1; j > 0; j--){
            if (ratings[j] < ratings[j-1] && nums[j-1] <= nums[j]) {
                nums[j-1] = nums[j] + 1;
            }
        }   
        // 求和
        let sum = 0;
        for(let i = 0; i < nums.length; i++){
            sum += nums[i];
        }
        return sum;
    }
    
    

    总结

    • 本题采用了贪心策略,从局部到全局,在每一次遍历中,只考虑一侧的大小关系并进行更新,进行从左到右和从右到左两次遍历后,就行求和OK啦

    起源地下载网 » LeetCode135.分发糖果 | 刷题打卡

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元