题解 | #分糖果问题#

分糖果问题

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

相关推荐

01-12 14:08
门头沟学院 Java
有寒假来武汉小米总部实习的大学生嘛,我也是小米的员工,想找合租舍友,仅限女生可免租半月,二月初可入住,也就是说房租是2.15开始算的哦~也可以将行李提前放过来~房屋介绍:1、房子情况:有电梯;租的是三室一厅一卫一厨,&nbsp;但是有个卧室比较小,不打算找人,只住两个人就可以了;衣柜也很大,可以放下很多衣服;房屋采光真的很好,早上起来可以在床上晒太阳的那种,十分惬意(夏季晚上十分好看!)2.&nbsp;楼下离我们很近的地方有小吃街和一个两层大超市(大概步行两分钟多就可以走到)&nbsp;,还有一个新开的麦当劳,晚上可以去吃小吃,购买物资也可以去大超市;3.&nbsp;房子基本设施齐备(洗衣机,冰箱,空调,油烟机,热水器);4.&nbsp;我有稳定的工作,生活中很注意卫生,周末有时间会自己做饭,可以投喂哦~5.&nbsp;出行:距离公交站步行10分钟不到,距政务中心,武汉小米总部三站(晚上我都是走回来的,很近的~);一个比较进的地铁,距离大概1km左右;出入我觉得很方便;6.&nbsp;房租:1150每月,押一付二,无物业费,也没有中介费和其他额外费用。7.&nbsp;民用水电燃气,用多少交多少,水电费正常平摊。希望你是:1.&nbsp;女生(本人女),不带异性回家,如有同性朋友来玩,最多过夜一晚;2.&nbsp;爱干净,讲卫生,作息正常,不吵闹,有稳定工作;3.&nbsp;好沟通,有任何问题一定要沟通,不要闷着!中介勿扰,非诚勿扰!!!希望不要浪费彼此的时间诚心有意向的可以联系我看房
租房找室友
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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