双指针解决【接雨水】问题

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本篇将带来双指针算法经典题目之:接雨水问题;

image.png

算法系列, 继续日进一卒~ 之前文章传送门:



本篇将带来双指针算法经典题目之:接雨水问题;


题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

image.png

输入: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


解题思路:


解法 1 :暴力解法


直接按照题目的描述进行,对于数组中的每一个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度较小值减去当前高度的值。


如果i是2 左边的最大值是索引为1的位置,这个位置值是1;右边最大值是3,当前这个位置能够存储多少水,是由短的一边决定的;对于i为3的位置来说,算上当前的索引位置的高度左边的最大值是2。


右边的最大值是还是3,此时左右两边的最小值是2 当前索引处的高度,也是2 这样一来 ans 就是0。说明索引为3的位置不能存储雨水


JS 实现如下:

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function (height) {
  let res = 0;
  for (let i = 0; i < height.length; i++) {
    let max_letf = 0;
    let max_right = 0;
    // 以当前curr 这个位置为基准,找出左边的边界的最大值 找出右边边界的最大值
    for (let j = i; j >= 0; j--) {
      max_letf = Math.max(max_letf, height[j])
    }
    for (let j = i; j < height.length; j++) {
      max_right = Math.max(max_right, height[j])
    }
    res += Math.min(max_letf, max_right) - height[i]
  }
  return res
};


解法 2 :双指针


当左边最大挡板<右边最大挡板,左边向前挺近,最终值加上当前左最大挡板-当前左指针所指值(相当于左边只要不超过右边,右边最大挡板稳定兜底,左边无脑挺近累加)大于则反之;


JS 实现:

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
    let end = 0 
    let l = 0, r=height.length -1
    let maxl = 0,maxr=0
    while(l < r){
        maxl = Math.max(height[l],maxl)
        maxr = Math.max(height[r],maxr)
        if(maxl < maxr){
            end += maxl - height[l]
            l++
        }else{
            end += maxr - height[r]
            r--
        }
    }
    return end
};


时间复杂度:O(n);双指针,YYDS!

有木有觉得双指针和滑动窗口很像?后续还会带来更多关于双指针的探究~~


OK,以上就是本篇分享~ 撰文不易,点赞鼓励👍👍👍

我是掘金安东尼,公众号同名,日拱一卒、日掘一金,再会~



相关文章
IDEA常用插件之翻译插件
IDEA常用插件之翻译插件
765 2
预期违背理论(expectancy violations theory)
预期违背理论(Expectancy Violations Theory)是由心理学家 John Bowlby 提出的,该理论认为人们在社交互动中会根据以往的经验和预期来判断他人的行为。当他人的行为与我们的预期相违背时,我们会产生一种心理上的不适感,这种不适感可能表现为惊讶、失望、愤怒等情绪。预期违背理论可以用来解释人们在社交互动中的情绪反应,以及为什么人们会对他人的行为产生不同的情感体验。
10772 4
|
机器学习/深度学习
信道编码译码及MATLAB仿真(三)
信道编码译码及MATLAB仿真
1106 3
|
canal 消息中间件 存储
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
1403 0
|
设计模式 供应链
一文教会你如何写复杂业务代码
了解我的人都知道,我一直在致力于应用架构和代码复杂度的治理。 这两天在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,是一个新课题。针对该命题,我进行了比较细致的思考和研究。
38940 3
|
10月前
|
SQL JSON Java
告别字符串拼接:用Java文本块优雅处理多行字符串
告别字符串拼接:用Java文本块优雅处理多行字符串
622 108
|
7月前
|
安全 Java 数据安全/隐私保护
认识SpringSecurity
Spring Security 是基于过滤器链的成熟安全框架,提供认证、鉴权及防御 CSRF 等攻击的核心功能,支持多种认证方式与灵活的权限控制模型。
|
7月前
|
人工智能 自然语言处理 算法
AI原生应用的核心:不是"打补丁",而是范式重构——Java团队的破局之路
JBoltAI助力Java团队实现AI原生转型,突破传统“菜单驱动”模式,构建以“意图驱动”为核心的智能应用。通过AIGS范式,融合大模型与企业系统,实现自然语言交互、智能流程编排与跨系统协同,提供从架构设计到落地支持的全流程解决方案,推动软件范式根本性升级。(239字)
320 3
|
机器学习/深度学习 人工智能 自然语言处理
AI在内容创作中的创新:开启智能创意的新时代
AI在内容创作中的创新:开启智能创意的新时代
1640 14