zoukankan      html  css  js  c++  java
  • 力扣算法——135Candy【H】

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。

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

    每个孩子至少分配到 1 个糖果。
    相邻的孩子中,评分高的孩子必须获得更多的糖果。
    那么这样下来,老师至少需要准备多少颗糖果呢?

    示例 1:

    输入: [1,0,2]
    输出: 5
    解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
    示例 2:

    输入: [1,2,2]
    输出: 4
    解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
    第三个孩子只得到 1 颗糖果,这已满足上述两个条件。

    Solution:

      两种方法:

      方法一:

        使用一个数组先给每个人发一颗糖,然后比较每个人的右边,给右边的数大的加一颗糖,再比较左边,给左边大的数加一颗糖

      

     1 class Solution {
     2 public:
     3     int candy(vector<int> &ratings) {
     4         vector<int>v(ratings.size(), 1);
     5         for (int i = 0; i < ratings.size() - 1; ++i)
     6             if (ratings[i + 1] > ratings[i])v[i + 1] = v[i] + 1;
     7         for (int i = ratings.size() - 1; i > 0; --i)
     8             if (ratings[i - 1] > ratings[i])v[i - 1] = max(v[i - 1], v[i] + 1);
     9         int res = 0;
    10         for (auto a : v)
    11             res += a;
    12         return res;
    13     }
    14 };

      方法二:

        借助数学的排列组合来进行计算

      

     1 class Solution {
     2 public:
     3     int candy(vector<int> &ratings) {
     4         if (ratings.empty())return 0;
     5         int res = 1, pre = 1, cnt = 0;
     6         for (int i = 1; i < ratings.size(); ++i)
     7         {
     8             if (ratings[i] >= ratings[i - 1])
     9             {
    10                 if (cnt > 0)//需要向前追加的糖的个数
    11                 {
    12                     res += cnt * (cnt + 1) / 2;
    13                     if (cnt >= pre)res += cnt - pre + 1;
    14                     cnt = 0;
    15                     pre = 1;
    16                 }
    17                 pre = (ratings[i] == ratings[i - 1]) ? 1 : pre + 1;
    18                 res += pre;
    19             }
    20             else
    21                 ++cnt;
    22         }
    23         if (cnt > 0)
    24         {
    25             res += cnt * (cnt + 1) / 2;
    26             if (cnt >= pre)res += cnt - pre + 1;
    27         }
    28         return res;
    29     }
    30 };

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/candy
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    windows 安装 nodejs指定版本
    Xshell通过ssh登录远程服务器(秘钥)
    CentOS7 防火墙操作
    Linux系统MySQL开启远程连接
    PHP 下载图片文件并压缩文件成zip
    thinkphp 中更新数据字段,同时某字段值++操作(报错TP5.1不支持的数据表达式:[exp]的解决办法)
    layui的loading加载中
    Linux下面安装swoole
    windows 下cmd命令删除文件或者文件夹
    PHP 删除某目录下的全部文件
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11838500.html
Copyright © 2011-2022 走看看