135. 分发糖果

  采用三次遍历,第一次从左到右遍历,将右边大的数字加一,小的减一

  1,2,3,4,3,2,1

  1,2,3,4,1,0,-1

  第二次从右到左,检测小于1的数,然后加上add等于1,然后在递减序列中都加上add

  1,2,3,4,3,2,1

  最后一遍从左到右检测是否有不满足相邻的分数越大,糖果越多的情况,有的话纠正

  解答完毕

int candy(vector<int>& ratings) {
    int length = ratings.size();
    if (length < 2)
        return 1;
    vector<int> data(length, 1);
    int sum = 0;
    for (int i = 0; i < length-1; i++)
    {
        if (ratings[i] < ratings[i + 1])
            data[i + 1] = data[i] + 1;
        else if (ratings[i] > ratings[i + 1])
        {
            if (data[i] > 1)
                data[i + 1] = 1;
            else 
                data[i + 1] = data[i] - 1;
        }
    }
    for (int j = length - 1; j > 0; j--)
    {
        if (data[j] < 1)
        {
            int add = 1 - data[j];
            while ( j > 0 &&  data[j] + 1 == data[j - 1])
            {
                data[j] += add;
                j--;
            }
            data[j] += add;
        }
    }

    for (int i = 0; i < length - 1; i++)
    {
        if (ratings[i] > ratings[i + 1] && data[i] <= data[i + 1])
            data[i] = data[i + 1] + 1;
        else if (ratings[i] < ratings[i + 1] && data[i] >= data[i + 1])
            data[i+1] = data[i] + 1;
    }
    for (auto x : data)
        sum += x;
    return sum;
}

  网上有更好的解法,只需要两次遍历,这里不再累述。

  

原文地址:https://www.cnblogs.com/Oscar67/p/9306990.html