• 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的数组,从左往右,如果,右边大于左边,那么本出数值比前面的数值+1;

    接下来是从右到左,如果,如果仅仅是简单的左边大于右边,那么左边的数值比右边的数值+1;比如4 2 3 4 1,这个时候4>1,如果把数值+1,那么接下来往左走就会出现问题。


    第二种思路一开始都是一样,但是定义了一个cur=table[i+1]+1,这个时候要注意的一种情况就是比如比率是 1 2 3 1,前面的table是1 2 3 1,如果仅仅是+1,,还没有3大,所以就是判断一下最大值,至于后面,为什么要把刚刚的cur值复制给table[i],一方面可以这么理解,如果没有前面一个比率比后面一个大,这是自然要赋值的,如果发生了,那就把刚刚的最大值给他。

    代码:

    class Solution1 {
    public:
    //第一种解法
        int candy(vector<int>& ratings) {
            if(ratings.empty()) return 0;
            int n = ratings.size();
            vector<int> table(n, 1);
            
            for(int i=1;i<n;i++){
                if(ratings[i]>ratings[i-1]) table[i]=table[i-1]+1;
            }
            int res=table[n-1];
            for(int i=n-2;i>=0;i--){
                if(ratings[i]>ratings[i+1]&&table[i]<=table[i+1])   table[i]=table[i+1]+1;
                //杜绝 1 2 1 现象的发生
                res+=table[i];
            }
            return res;
        }
    };
    
    class Solution2 {
    public:
    //第二种解法
        int candy(vector<int>& ratings) {
            if(ratings.empty()) return 0;
            int n = ratings.size();
            vector<int> table(n, 1);
            
            for(int i=1;i<n;i++){
                if(ratings[i]>ratings[i-1]) table[i]=table[i-1]+1;
            }
            int res=table[n-1];
            for(int i=n-2;i>=0;i--){
                int cur=1;
                if(ratings[i]>ratings[i+1]){
                    cur=table[i+1]+1;
                }
                res+=max(cur,table[i]);
                table[i]=max(cur,table[i]);
                //table[i]=cur 或者  table[i]=max(cur,table[i]) 均可
                // 没有“table[i]=cur;”  对 [1,3,1] 无影响
            }
            
            return res;
        }
    };


  • 相关阅读:
    为什么重复值高的字段不能建索引(比如性别字段等)
    【转】微服务架构技术栈选型手册
    【转】使用索引为什么能提高查询速度?
    SpringBoot读取配置文件(从classpath/file读取yml/properties文件)
    集合总结--ArrayList、LinkedList、HashMap
    HashMap问答
    【转】http的keep-alive和tcp的keepalive区别
    【转】大数据分析中Redis怎么做到220万ops
    哪个中年IT男不是一边面对危机,一边咬牙硬抗【转】
    SVN clean失败解决方法【转】
  • 原文地址:https://www.cnblogs.com/jsrgfjz/p/8519864.html
Copyright © 2020-2023  润新知