zoukankan      html  css  js  c++  java
  • 【leetcode】Candy(hard) 自己做出来了 但别人的更好

    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?

    注意,像 6 5 5 4 这样的 可以分 2 1 2 1 就是数字相同的不需要糖果数相同

    我的思路,分别用两个vector存储递增和递减所需要的糖果,最终结果取两个的最大值

    如 权重    6 6 1 5 4 4 3 7 4 2 2 2 5 4 3 5

    找递增     1 1 1 2 1 1 1 2 1 1 1 1 2 1 1 2   从前向后找,初始都是1,遇到递增的就加上他前面查找的数字

    找递减     1 2 1 2 1 2 1 3 2 1 1 1 3 2 1 1   从后向前找,初始都是1,遇到递增的就加上他前面查找的数字

    最终        1 2 1 2 1 2 1 3 2 1 1 1 3 2 1 2

    int candy(vector<int> &ratings) {
            int ans = 0;
            vector<int> candysUp(ratings.size(), 1);
            vector<int> candysDown(ratings.size(), 1);
            for(int i = 1; i < ratings.size(); i++) //查找递增
            {
                if(ratings[i] > ratings[i - 1])
                {
                    candysUp[i] += candysUp[i - 1];
                }
            }
            for(int i = ratings.size() - 2; i >= 0; i--) //查找递减
            {
                if(ratings[i + 1] < ratings[i])
                {
                    candysDown[i] += candysDown[i + 1];
                }
            }
    
            for(int i = 0; i < ratings.size(); i++)
            {
                ans += max(candysUp[i], candysDown[i]);
            }
            return ans;
        }

    大神只循环一遍的思路:

    其实整体思想跟上面一样,但是上面需要循环很多次是因为递增和递减分别处理。因为递减时不知道最大的数应该加几。

    大神的思路是递增的就像上面那样加,但是递减的,先都加1,如果后面仍是递减的,再把之前少加的给加回来(如前面有nSeqLen个数字少加了1,就把答案直接多加一个nSeqLen)。

        //大神循环一遍的代码
        int candy2(vector<int> &ratings) {
        int nCandyCnt = 0;///Total candies
        int nSeqLen = 0;  /// Continuous ratings descending sequence length
        int nPreCanCnt = 1; /// Previous child's candy count
        int nMaxCntInSeq = nPreCanCnt;
        if(ratings.begin() != ratings.end())
        {
            nCandyCnt++;//Counting the first child's candy.
            for(vector<int>::iterator i = ratings.begin()+1; i!= ratings.end(); i++)
            {
                // if r[k]>r[k+1]>r[k+2]...>r[k+n],r[k+n]<=r[k+n+1],
                // r[i] needs n-(i-k)+(Pre's) candies(k<i<k+n)
                // But if possible, we can allocate one candy to the child,
                // and with the sequence extends, add the child's candy by one
                // until the child's candy reaches that of the prev's.
                // Then increase the pre's candy as well.
    
                // if r[k] < r[k+1], r[k+1] needs one more candy than r[k]
                if(*i < *(i-1))
                {
                    //Now we are in a sequence
                    nSeqLen++;
                    if(nMaxCntInSeq == nSeqLen)
                    {
                        //The first child in the sequence has the same candy as the prev
                        //The prev should be included in the sequence.
                        nSeqLen++;
                    }
                    nCandyCnt+= nSeqLen;
                    nPreCanCnt = 1;
                }
                else
                {
                    if(*i > *(i-1))
                    { 
                        nPreCanCnt++;
                    }
                    else
                    {
                        nPreCanCnt = 1;
                    }
                    nCandyCnt += nPreCanCnt;
                    nSeqLen = 0;
                    nMaxCntInSeq = nPreCanCnt;
                }   
            }
        }
        return nCandyCnt;
    }
  • 相关阅读:
    latin1字符集的数据转换为utf8字符集
    mysql使用utf8mb4经验吐血总结
    字符集GBK和UTF8的区别说明
    10分钟学会理解和解决MySQL乱码问题
    MySQL大小写敏感总结
    分区表基本类型
    form表单提交的几种方法
    Redis面试题及分布式集群
    ELK
    Linux下的crontab定时执行任务命令详解
  • 原文地址:https://www.cnblogs.com/dplearning/p/4134923.html
Copyright © 2011-2022 走看看