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

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;
    }
相关推荐
小小de风呀24 分钟前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
Hello.Reader1 小时前
算法基础(十)——分治思想把大问题拆成小问题
java·开发语言·算法
CHANG_THE_WORLD2 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
绛橘色的日落(。・∀・)ノ2 小时前
机器学习之评估与偏差方差分析
算法
消失的旧时光-19432 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
AI_Ming3 小时前
从0开始学AI:层归一化,原来是这回事!
算法·ai编程
WL_Aurora3 小时前
备战蓝桥杯国赛【Day 8】
算法·蓝桥杯
螺丝钉的扭矩一瞬间产生高能蛋白3 小时前
QT的C++接口基础用法
c++·qt·嵌入式软件·嵌入式linux·linux应用
智者知已应修善业3 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
MediaTea3 小时前
Scikit-learn:从数据到结构——无监督学习的最小闭环
人工智能·学习·算法·机器学习·scikit-learn