leetcode 17 Candy

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

初始化所有小孩糖数目为1,从前往后扫描,如果第i个小孩等级比第i-1个高,那么i的糖数目等于i-1的糖数目+1;

从后往前扫描,如果第i个的小孩的等级比i+1个小孩高,但是糖的数目却小或者相等,那么i的糖数目等于i+1的糖数目+1。

该算法时间复杂度为O(N)


#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int candy(vector<int> &ratings)
{
        vector<int> count(ratings.size(),1);
        int i,len=count.size();
        for(i=0;i<len;i++)
        {
                if(ratings[i+1]>ratings[i]&&count[i+1]<=count[i])
                        count[i+1]=count[i]+1;
        }
        for(i=len-1;i>=0;i--)
        {
                if(ratings[i-1]>ratings[i]&&count[i-1]<=count[i])
                        count[i-1]=count[i]+1;
        }
        int sum=0;
        for(i=0;i<len;i++)
                sum+=count[i];
        return sum;
}
int main(int argc,char *argv[])
{
        freopen("input.txt","r",stdin);
        vector<int> v;
        int num,tmp;
        cin>>num;
        while(num--)
        {
                cin>>tmp;
                v.push_back(tmp);
        }
        cout<<candy(v)<<endl;
        return 0;
}

这个题只要知道了模拟的方法,就比较简单了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值