题解 | #分糖果问题#

分糖果问题

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;
    }
};
全部评论

相关推荐

10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务