[leetcode] Candy

Description

Problem Link
一群小孩站成线。每个小孩有一个分值。现在要分糖果,需要满足两个条件:
1. 每个小孩至少要有一颗糖。
2. 分值较高的小孩要比他的左右拿更多的糖。
问最少需要多少糖果。

e.g.
scores[] = {1,3,5,7,7,7,4,1}
candy[] = {1,2,3,4,1,3,2,1}
ANS = 1+2+3+4+1+3+2+1 = 17

Possible Solution

贪心

分析: 如果从左到右扫一遍,唯一能确定的就是递增序列,例如,[1,3,5,7], 那么最优解是[1,2,3,4]。
做法:序列一共三种,递增,递减,不变,对于递增的序列从左向右扫的时候确定答案,对于递减序列从右向左扫确定答案,对于不变序列,除了头和尾,其他分到的糖果都为1.
附代码:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        vector<int> candy(n,0);
        for (int i = 0; i < n; ++i) {
            bool bol = true;
            if (i != 0 && ratings[i] > ratings[i-1]) bol = false;
            if (i != n-1 && ratings[i] > ratings[i+1]) bol = false;
            if (bol) candy[i] = 1;
        }
        for (int i = 1; i < n; ++i) 
            if (ratings[i] > ratings[i-1]) candy[i] = candy[i-1] + 1;
        for (int i = n-2; i >= 0; --i) 
            if (ratings[i] > ratings[i+1]) candy[i] = std::max(candy[i+1]+1, candy[i]);
        int ans = 0;
        for (int i = 0; i < n; ++i) 
            ans += candy[i];
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值