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

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 <= ratingsi <= 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;
    }
相关推荐
ShineWinsu15 小时前
对于MySQL:内置函数的解析
linux·数据库·c++·mysql·面试·函数·查询
302wanger15 小时前
分享一个工作习惯:整点看即时消息
算法
洋不写bug17 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.33317 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
AgentMaster17 小时前
数据治理工具选型指南:一套可复用的四阶段决策框架
大数据·数据结构·人工智能·算法
程序猿编码18 小时前
纯C++轻量计算机视觉推理引擎:基于GGML的端侧CV模型部署技术全解析
开发语言·c++·计算机视觉·大模型·transformer
liliangcsdn18 小时前
最终留出样本/样本外测试集-holdout解读
算法
爱敲代码的小黄18 小时前
机器学习入门:从数据、训练到业务决策
算法
数据知道18 小时前
哈希与密码存储——bcrypt、Argon2、盐值与彩虹表
网络·算法·安全·网络安全·密码学·哈希算法
haon112218 小时前
树模型在信贷风控怎么用——从决策树到 XGBoost
大数据·人工智能·算法·决策树·机器学习·数据挖掘