力扣原题《分发糖果》,采用二分原则,纯手搓,待验证

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。

相邻两个孩子中,评分更高的那个会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:

输入:ratings = [1,0,2]

输出:5

解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:

输入:ratings = [1,2,2]

输出:4

解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。

第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
提示:

n == ratings.length

1 <= n <= 2 * 104

0 <= ratings[i] <= 2 * 104

我的答案

cpp 复制代码
class Candy {
public:
    Candy() {}
    int candy(vector<int>& ratings) {
        int candyCount = 0;
        for (int i = 0; i < ratings.size(); i++)
        {
           candyCount+= toCompare(ratings, i);
        }
        std::cout <<std::endl;
        return candyCount;
    }
    int toCompare(vector<int>& ratings,int i)//返回该孩子的糖果数量,二分原则
    {
        int canGiveCandyCount = 1;//每人默认一个
        int theFrontIdx = i, thebBackIdx = i;
        int tag = 0;//防止重复分配
        int leftContinuous = -1;//出现连续的情况
        while (--theFrontIdx>=0)
        {
            if (ratings[theFrontIdx] < ratings[i]) 
            {
                if (theFrontIdx + 1 == i) 
                    ++tag;
                leftContinuous++;
                if (theFrontIdx-1>=0&& ratings[theFrontIdx-1]>=ratings[theFrontIdx])
                {
                   canGiveCandyCount++;
                   break;
                }
                else 
                    canGiveCandyCount++;
            }
            else 
                break;
        }
        int rightContinuous = -1;//出现连续的情况
        while (++thebBackIdx < ratings.size())
        {
            if (ratings[thebBackIdx] < ratings[i]) 
            {  
                if (thebBackIdx - 1 == i) 
                    ++tag;
                rightContinuous++;
                if (thebBackIdx + 1 < ratings.size() && ratings[thebBackIdx + 1] >= ratings[thebBackIdx])
                {
                    canGiveCandyCount++;
                    break;
                }
                else
                    canGiveCandyCount++;
            }
            else
                break;
        }
        if (tag == 2) //去重
        {
            if (leftContinuous > 0 && rightContinuous > 0)
                canGiveCandyCount = canGiveCandyCount - leftContinuous - rightContinuous;
            else//虽然没有重复,但是左右多加了一次
                canGiveCandyCount--;
        }
        std::cout<< canGiveCandyCount<<"," ;
        return canGiveCandyCount;
    }
};

int main()
{
    vector<vector<int>> ratings;
    ratings.push_back({ 1,2,3,1,0 });
    ratings.push_back({ 1,3,4,5,2 });
    ratings.push_back({ 1,3,2,2,1 });
    ratings.push_back({ 1,0,2 });
    ratings.push_back({ 1,2,2 });
    Candy c1;
    for (vector<vector<int>>::iterator iter = ratings.begin(); iter != ratings.end(); iter++)
    {
        std::cout << "最少准备糖果:" << c1.candy(*(iter)) << std::endl;
    }
相关推荐
IronMurphy4 小时前
【算法三十九】994. 腐烂的橘子
算法
Ares-Wang5 小时前
算法》》旅行商问题 TSP、7座桥问题 哈密顿回路 深度优先 和 宽度优先
算法·深度优先·宽度优先
Liqiuyue5 小时前
Transformer:现代AI革命背后的核心模型
人工智能·算法·机器学习
WolfGang0073215 小时前
代码随想录算法训练营 Day34 | 动态规划 part07
算法·动态规划
And_Ii5 小时前
LCR 168. 丑数
c++
Kk.08026 小时前
Linux(十一)fork实例练习、文件操作示例及相关面试题目分享
linux·运维·算法
CoderMeijun6 小时前
C++ 时间处理与格式化输出:从 Linux 时间函数到 Timestamp 封装
c++·printf·stringstream·时间处理·clock_gettime
潇冉沐晴6 小时前
2026CCCC第三次模拟赛 部分题解
算法
WolfGang0073217 小时前
代码随想录算法训练营 Day32 | 动态规划 part05
算法·动态规划