分糖果问题 (贪心算法)

简单来说就是在限制值的基础上找期望值。

描述

一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:

1. 每个孩子不管得分多少,起码分到一个糖果。

2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)

给定一个数组 arrarr 代表得分数组,请返回最少需要多少糖果。

要求: 时间复杂度为 O(n)O(n) 空间复杂度为 O(n)O(n)

数据范围: 1≤n≤1000001≤n≤100000 ,1≤ai≤10001≤ai​≤1000

class Solution {
public:
    int candy(vector<int>& arr) {
        // write code here
        vector<int> nums(arr.size(),1);
        //从左到右遍历
        for(int i=1;i<arr.size();i++)
        {
            //如果右边在递增,每次增加一个
            if(arr[i]>arr[i-1])
            nums[i]=nums[i-1]+1;
        }
        //记录总糖果数
        int res=nums[arr.size()-1];//先给最后一个的值,再从后往前遍历一遍,累加
        //从右到左遍历
        for(int i=arr.size()-2;i>=0;i--)
        {
            //如果左边更大但是糖果数更小
            if(arr[i]>arr[i+1]&&nums[i]<=nums[i+1])
            {
                nums[i]=nums[i+1]+1;
            }
            //累加和
            res+=nums[i];
        }
        return res;
    }
};

总结:本身不难,难的是思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值