12
返回列表 发新帖
楼主: newkid

[每日一题] 趣味SQL题:力扣 42 之接雨水

[复制链接]
论坛徽章:
2
20周年集字徽章-周
日期:2023-08-03 16:37:4519周年集字徽章-19
日期:2024-09-07 21:32:18
11#
发表于 2024-8-27 09:48 | 只看该作者
newkid 发表于 2024-8-27 07:16
我把刘老师的写法精简一下,可以说是极简了,很惊叹这么少的代码就能解题:WITHmid1 as(select a.*    ,max ...

那个greatest函数应该还可以去掉, 因为least>=height

使用道具 举报

回复
论坛徽章:
94
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
12#
发表于 2024-8-27 10:42 | 只看该作者
newkid 发表于 2024-8-27 07:16
我把刘老师的写法精简一下,可以说是极简了,很惊叹这么少的代码就能解题:WITHmid1 as(select a.*    ,max ...

我。。。。
这点代码就能实现的,你整了半天花里胡哨的?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
13#
 楼主| 发表于 2024-8-27 22:39 | 只看该作者
udfrog 发表于 2024-8-27 10:42
我。。。。这点代码就能实现的,你整了半天花里胡哨的?

活到老学到老,我就爱这花里胡哨的

使用道具 举报

回复
论坛徽章:
0
14#
发表于 2024-8-27 23:21 | 只看该作者
苏老师分享到位

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
15#
 楼主| 发表于 2024-8-28 22:33 | 只看该作者

原文链接

解锁SQL无限可能 | 如何利用SQL求解力扣难题接雨水问题?
Original 江月明203 会飞的一十六
2024年08月27日 09:37
本问题由oracle大神苏旭辉老师提出,其oracle解法及链接如下
趣味SQL题:力扣 42 之接雨水 - Oracle开发 - ITPUB论坛-专业的IT技术社区。该题目属于趣味题目,感兴趣的同学可以研究一下
01
题目描述
   力扣原文链接:42. 接雨水 - 力扣(LeetCode)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接6 个单位的雨水(蓝色部分表示雨水)。
示例 2:


输入:height = [4,2,0,3,2,5]
输出:9





02
数据准备


  •   




with rain_data as(  select array(0,1,0,2,1,0,1,3,2,1,2,1) height)select * from rain_data;









03
问题分析
本文为力扣第42题,属于hard级别。分析该问题的关键点在于"找规律,抓特征",这也是我专栏里一直提的核心技巧,语言不重要,重要的是思维方法,是算法逻辑,其余的工作只是利用语言去翻译,这一点对SQL语言尤为重要,因为语法简单的语言在实现上一定要重思维,重逻辑。


这道题其实就是“木桶原理”,简单的说就是一个柱子能接多少水,取决于它两边“较短的板”。另外一个前提条件就是,两边的柱子高度都要比所要装水的柱子的高度要高,否则肯定是无法装水的。因此我们只需要关注左边最高的木板和右边最高的模板中较矮的一个就够了,那么存储的水,等于两边木板的较小值减去当前高度的值。用公式表示如下:


res = min(l_max, r_max) - height; 我们将上述公式翻译成SQL语言即可:
第一步:先将数组展开成行


  •   



select tmp.pos + 1 id          , tmp.height  height     from rain_data              lateral view posexplode(height) tmp as pos, height
第二步:求截止当前位置处,左最大与右最大


  •   










select  id    , height    , max(height) over(order by id) l_max    , max(height) over(order by id desc) r_maxfrom    (select tmp.pos + 1 id          , tmp.height  height     from rain_data              lateral view posexplode(height) tmp as pos, height     )        t;
第三步:利用公式进行标记




  •   












select id      ,height      ,least(l_max,r_max) - height     as rain_flgfrom(select id      , height      , max(height) over (order by id)      l_max      , max(height) over (order by id desc) r_max from (select tmp.pos + 1 id            , tmp.height  height       from rain_data                lateral view posexplode(height) tmp as pos, height) t) torder by id
第四步:求出最终结果值。完整的SQL如下:


  •   





select sum(rain_flg)from(select least(max(tmp.height) over (order by id), max(tmp.height) over (order by id desc)) - tmp.height rain_flg from rain_data r          lateral view posexplode(r.height) tmp as id, height ) t
04
小结


关于本题,作者进行了多次探索,最终能想到利用SQL解决的即文中所述,若采用代码语言上述的方法属于暴力求解,需要优化其两边搜所的效率,因此就会有双指针和动态规划的求解思路。但对于本文一开始而言找出”木桶原理”的特征(res= min(l_max, r_max) - height),也不是一件容易得事情,需要一定问题的分析能力。有兴趣的读者可以尝试是否可以利用单调栈的方法,利用SQL语言求解出本题。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
16#
 楼主| 发表于 2024-8-28 22:43 | 只看该作者
江老师经过独立思考,最终写出的SQL和刘老师殊途同归

使用道具 举报

回复
论坛徽章:
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
17#
发表于 2024-9-1 18:27 | 只看该作者
本帖最后由 〇〇 于 2024-9-1 18:48 编辑

立体接雨水407https://leetcode.cn/problems/trapping-rain-water-ii/

使用道具 举报

回复

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

本版积分规则 发表回复

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