题解 | #分糖果问题#

分糖果问题

http://www.nowcoder.com/practice/76039109dd0b47e994c08d8319faa352

这一道题其实蛮有趣的,都说是贪心,我没感觉出来。所以我做得比较复杂。这道题时间复杂度要求较高,但是空间复杂度为O(n),所以从这里出发我定义了left和right两个vector来获取左右大小情况(注意前后先插入头尾两个数),然后从左遍历一次,再从右遍历一次即可满足要求了。cr和cl这两个参数主要是用来观察是否有连续右边的数大或者连续左边的数大。

public:
    /**
     * pick candy
     * @param arr int整型vector the array
     * @return int整型
     */
    int candy(vector<int>& arr) {
        // write code here
        int res = 0;
        int size = arr.size();
        if(size==1)
            return 1;
        vector<int> left(size,0);
        vector<int> right(size,0);
        vector<int> rest(size,1);
        arr.push_back(arr[size-1]);
        arr.insert(arr.begin(),arr[0]);
        for(int i =1.;i<arr.size()-1;i++)
        {
            left[i-1] = arr[i]-arr[i-1];
            right[i-1] = arr[i]-arr[i+1];
        }
        int cl = 0;
        for(int i=0;i<rest.size();i++)
        {
            if(left[i]>0&&cl==0)
            {
                rest[i]++;
                cl = 1;
            }
            if(left[i]>0&&cl==1)
            {
                rest[i] = rest[i-1]+1;
                cl = 1;
            }
            if(left[i]<=0)
                cl = 0;
        }
        for(int i=0;i<rest.size();i++)
            cout<<rest[i]<<" ";
        cout<<endl;
        int cr = 0;
        for(int i=rest.size()-1;i>=0;i--)
        {
            if(right[i]>0&&cr==0)
            {
                if(rest[i]<=rest[i+1])
                    rest[i]++;
                cr = 1;
            }
            if(right[i]>0&&cr==1)
            {
                if(rest[i]<=rest[i+1])
                    rest[i] = rest[i+1]+1;
                cr = 1;
            }
            if(right[i]<=0)
                cr = 0;
        }  
        int out = 0;
        for(int i=0;i<rest.size();i++)
            out+=rest[i];
        
        return out;
    }
};
全部评论

相关推荐

本2硕9,秋招不想努力海投了
小何和:行情再不好也不可能拒绝你,不可能只要双9的
点赞 评论 收藏
分享
06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务