• 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;
    }

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

      

  • 相关阅读:
    108.将有序数组转换成二叉搜索树
    剑指Offer 09.用两个栈实现队列
    215.数组中的第K个最大元素
    AcWing 845.八数码
    1.两数之和
    迷宫问题
    倒计时
    Redis 红包
    Redis
    EF Api 全套
  • 原文地址:https://www.cnblogs.com/Oscar67/p/9306990.html
Copyright © 2020-2023  润新知