zoukankan      html  css  js  c++  java
  • 0135分发糖果 Marathon

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

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

    每个孩子至少分配到 1 个糖果。
    评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。
    那么这样下来,老师至少需要准备多少颗糖果呢?

    示例 1:

    输入:[1,0,2]
    输出:5
    解释:你可以分别给这三个孩子分发 2、1、2 颗糖果。
    示例 2:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/candy

    参考:

    python

    # 0135.分发糖果
    class Solution:
        def candy(self, ratings: [int]) -> int:
            """
            初始化每人至少一颗
            分别向前向后遍历,
            - 向后遍历,右边元素比左边元素大,糖果数+1
            - 向前遍历,左边元素比右边元素大,已经比右边大保持,否则糖果数+1
            最后计和
            :param ratings:
            :return:
            """
            candyVec = [1] * len(ratings)
            for i in range(1, len(candyVec)):
                if ratings[i] > ratings[i-1]:
                    candyVec[i] = candyVec[i-1] + 1
            for i in range(len(ratings)-2, -1, -1):
                if ratings[i] > ratings[i+1]:
                    candyVec[i] = max(candyVec[i], candyVec[i+1]+1)
            return sum(candyVec)
    

    golang

    //+build ignore
    
    package main
    
    import "fmt"
    
    func main()  {
    	ratings := []int{1,0,2}
    	fmt.Println(candy(ratings))
    }
    
    func candy(ratings []int) int {
    	/*
    	先确定一边,再确定另外一边
    	1.先从左到右,当右边的大于左边的就加1
    	2.再从右到左,当左边的大于右边的就再加1
    	*/
    	need := make([]int, len(ratings))
    	sum := 0
    	for i:=0;i<len(ratings);i++ {
    		need[i] = 1
    	}
    	// 向后遍历,右边大于左边,++
    	for i:=0;i<len(ratings)-1;i++ {
    		if ratings[i] < ratings[i+1] {
    			need[i+1] = need[i] + 1
    		}
    	}
    	// 向前遍历,左边大于右边,左边+1,但要花费最少糖果,需要判断当下糖果数
    	for i:=len(ratings)-1;i>0;i-- {
    		if ratings[i-1] > ratings[i] {
    			need[i-1] = max(need[i-1], need[i]+1)
    		}
    	}
    	for _,v := range need {
    		sum += v
    	}
    	return sum
    }
    
    func max(a,b int) int {
    	if a > b {
    		return a
    	}
    	return b
    }
    
  • 相关阅读:
    求最长不降子序列

    普通背包问题
    求最大子序列
    最大人品
    C# 显示webBrowser页面加载进度
    Provider 错误 '80004005' 未指定的错误 的最终解决方法
    C# 截取webBrowser网页存为图片
    浅谈Python小数据池
    js文件编译成动态链接库(dll)文件
  • 原文地址:https://www.cnblogs.com/davis12/p/15605116.html
Copyright © 2011-2022 走看看