[贪心] leetcode 135 Candy

problem:https://leetcode.com/problems/candy/ 

      一道贪心题,先从左往右扫一遍,保证右边比左边高分的拿到更多糖果,再从右往左扫一遍,保证左边比右边分高的拿到更多糖果,时间复杂度O(N)。

        第一次的算法是顺序更新,O(N^2)的,每次发现右边比左边大还要回去更新所有的分数。最后一个数据点超时了……如下:

public:
    int candy(vector<int>& ratings) {
        vector<int> accept(ratings.size(), 1);
        for(int i = 0;i < ratings.size();i++)
        {
            if(i - 1 >= 0 && ratings[i] > ratings[i - 1])
            {
                accept[i] = accept[i - 1] + 1;
            }
            else if(i - 1 >= 0 && ratings[i] < ratings[i - 1])
            {
                for(int j = i - 1; j >= 0;j--)
                {
                    if(ratings[j + 1] < ratings[j] && accept[j + 1] >= accept[j])
                    {
                        accept[j] = accept[j + 1] + 1;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
        int res = accumulate(accept.begin(), accept.end(),0);
        return res;
    }
};

            优化后的算法如下:

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> accept(ratings.size(), 1);
        for(int i = 0;i < ratings.size();i++)
        {
            if(i - 1 >= 0 && ratings[i] > ratings[i - 1])
            {
                accept[i] = accept[i - 1] + 1;
            }
        }
        for(int i = ratings.size() - 1;i >= 0 ;i--)
        {
            if(i - 1 >= 0 && ratings[i] < ratings[i - 1])
            {
                if(accept[i - 1] <= accept[i])
                    accept[i - 1] = accept[i] + 1;
            }
        }
        int res = accumulate(accept.begin(), accept.end(),0);
        return res;
    }
};

 

posted @ 2019-07-30 22:08  fish1996  阅读(115)  评论(0)    收藏  举报