查看: 326|回复: 8

[每日一题] 趣味SQL: 力扣135. 分发糖果

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2024-9-10 05:35 | 显示全部楼层 |阅读模式
本帖最后由 newkid 于 2024-9-10 05:38 编辑

原题链接

135. 分发糖果
困难
相关标签
相关企业
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 <= 2 * 104

论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2024-9-10 05:38 | 显示全部楼层
本帖最后由 newkid 于 2024-9-11 03:39 编辑

create table candy (id number, rating number);

delete candy;

insert into candy
select level
      ,regexp_substr(s,'[^,]+',1,level)
from (select '1,3,2,2,2,1,3,4,4,4,4,6,6,6,5,4,3,3,3,7,8,9,9,9,3,2,5,5,5' s from dual
      )
connect by level<=regexp_count(s,',')+1;

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2024-9-10 08:29 | 显示全部楼层
相邻两个孩子评分更高的孩子会获得更多的糖果->相邻两个孩子评分一样高,某个孩子可以获得更多的糖果

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2024-9-10 21:47 | 显示全部楼层
〇〇 发表于 2024-9-10 08:29
相邻两个孩子评分更高的孩子会获得更多的糖果->相邻两个孩子评分一样高,某个孩子可以获得更多的糖果

这规则就是这样,分数一样的孩子得到的糖果数可以相同也可以不同。目标是总糖果数最少

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2024-9-12 13:17 | 显示全部楼层
1.先给全部的人一块,然后删除**的,
2.重复1,没有人了停止

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2024-9-12 13:30 | 显示全部楼层
〇〇 发表于 2024-9-12 13:17
1.先给全部的人一块,然后删除**的,2.重复1,没有人了停止

如果数字连续,每人糖块和原始分数一样
with recursive t(id,rt,candy)
as(select id,rating-min(rating)over(),1,from candy
union all
select id,rt-min(rt)over(),candy+1 from t where rt>0
)
select id,max(candy) from t group by id order by id;

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2024-9-13 00:44 | 显示全部楼层
你的SQL在ORACLE上跑我的测试数据:

        ID MAX(CANDY)
---------- ----------
         1          1
         2          3
         3          2
         4          2
         5          2
         6          1
         7          3
         8          4
         9          4
        10          4
        11          4
        12          6
        13          6
        14          6
        15          5
        16          4
        17          3
        18          3
        19          3
        20          7
        21          8
        22          9
        23          9
        24          9
        25          3
        26          2
        27          5
        28          5
        29          5

29 rows selected.

对比一下这个结果,显然你的糖果发多了:
       ID     RATING CANDY_COUNT
--------- ---------- -----------
        1          1           1
        2          3           2
        3          2           1
        4          2           1
        5          2           2
        6          1           1
        7          3           2
        8          4           3
        9          4           1
       10          4           1
       11          4           1
       12          6           2
       13          6           1
       14          6           4
       15          5           3
       16          4           2
       17          3           1
       18          3           1
       19          3           1
       20          7           2
       21          8           3
       22          9           4
       23          9           1
       24          9           3
       25          3           2
       26          2           1
       27          5           2
       28          5           1
       29          5           1

29 rows selected.

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2024-9-13 13:01 | 显示全部楼层
因为我没想到怎么处理同分异果

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2024-9-16 22:43 | 显示全部楼层
分析:当一个孩子分数比相邻孩子高,不管高多少,只需多给一颗糖即可满足需求。如果一个孩子左右都没有更高的分数,则这个孩子只需发一颗糖。把这样的孩子作为起点,左右分别找连续上升的分数,找到一个增加一颗糖。
所以题目任务变成:
寻找连续上升或者连续下降的段,这种线段的低点只需发一颗糖,其他人的糖果数就是他和**点的相差人数加1。
当一个孩子处于高峰点,即同时比左边和右边的都更高,则计算他和左右**点的距离,取其最大值。
在平直的段中,除了两边的端点,所有孩子都发只需一颗糖。两边端点可能是其他上升下降段的高点,此时按上面的计算方法发糖。

select id,max(rating) as rating,max(candy_cnt) as candy_count --------- 起终点在结果中都会出现两次,属于两个不同的段,取其最大值
  from candy
     match_recognize (
     order by id
     measures
        match_number() as grp
       ,CLASSIFIER() AS var_match
       ,count(*) as rn
       ,final count(*) as cnt
       ,case
        WHEN CLASSIFIER()='END_POINT' and rating>prev(rating)  --------- 上升段
             or CLASSIFIER()='UP' then count(*)
        when CLASSIFIER()='END_POINT' and rating<prev(rating)  --------- 下降段
             or CLASSIFIER()='DOWN' then final count(*) - RUNNING count(*)+1
        ELSE 1  ------- 平直段
        end as candy_cnt
     all rows per match
     after match skip to last end_point --------- 每一段的终点都是下一段的起点
     pattern( up+ end_point | flat+ end_point | down+ end_point)
     define up as rating<next(rating)
           ,flat as rating=next(rating)
           ,down as rating>next(rating)
     )
group by id  --------- 起终点在结果中都会出现两次,属于两个不同的段
order by id;


       ID     RATING CANDY_COUNT
--------- ---------- -----------
        1          1           1
        2          3           2
        3          2           1
        4          2           1
        5          2           2
        6          1           1
        7          3           2
        8          4           3
        9          4           1
       10          4           1
       11          4           1
       12          6           2
       13          6           1
       14          6           4
       15          5           3
       16          4           2
       17          3           1
       18          3           1
       19          3           1
       20          7           2
       21          8           3
       22          9           4
       23          9           1
       24          9           3
       25          3           2
       26          2           1
       27          5           2
       28          5           1
       29          5           1

29 rows selected.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表