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

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;
    }
相关推荐
aaaameliaaa7 小时前
字符函数和字符串函数
c语言·笔记·算法
城管不管8 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
月疯8 小时前
二分法算法(水平等分图形面积)
算法
豆瓣鸡8 小时前
算法日记 - Day3
java·开发语言·算法
白白白小纯9 小时前
算法篇—反转链表
c语言·数据结构·算法·leetcode
Achou.Wang9 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
The Chosen One9859 小时前
高进度算法模板速记(待完善)
java·前端·算法
小王C语言9 小时前
【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
网络·c++
圣保罗的大教堂11 小时前
leetcode 3517. 最小回文排列 I 中等
leetcode
土豆.exe11 小时前
Fastjson2 2.0.53 哈希碰撞 RCE:从原理到三种打法
算法·哈希算法