返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现收集雨水
  • 624
分享到

C++怎么实现收集雨水

2023-06-19 12:06:16 624人浏览 八月长安
摘要

本篇内容介绍了“c++怎么实现收集雨水”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Trapping Rain Water 收集雨水Give

本篇内容介绍了“c++怎么实现收集雨水”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Trapping Rain Water 收集雨水

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

C++怎么实现收集雨水

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

这道收集雨水的题跟之前的那道 Largest Rectangle in Histogram 有些类似,但是又不太一样,先来看一种方法,这种方法是基于动态规划 Dynamic Programming 的,维护一个一维的 dp 数组,这个 DP 算法需要遍历两遍数组,第一遍在 dp[i] 中存入i位置左边的最大值,然后开始第二遍遍历数组,第二次遍历时找右边最大值,然后和左边最大值比较取其中的较小值,然后跟当前值 A[i] 相比,如果大于当前值,则将差值存入结果,参见代码如下:

C++ 解法一:

class Solution {public:    int trap(vector<int>& height) {        int res = 0, mx = 0, n = height.size();        vector<int> dp(n, 0);        for (int i = 0; i < n; ++i) {            dp[i] = mx;            mx = max(mx, height[i]);        }        mx = 0;        for (int i = n - 1; i >= 0; --i) {            dp[i] = min(dp[i], mx);            mx = max(mx, height[i]);            if (dp[i] > height[i]) res += dp[i] - height[i];        }        return res;    }};

Java 解法一:

public class Solution {    public int trap(int[] height) {        int res = 0, mx = 0, n = height.length;        int[] dp = new int[n];        for (int i = 0; i < n; ++i) {            dp[i] = mx;            mx = Math.max(mx, height[i]);        }        mx = 0;        for (int i = n - 1; i >= 0; --i) {            dp[i] = Math.min(dp[i], mx);            mx = Math.max(mx, height[i]);            if (dp[i] - height[i] > 0) res += dp[i] - height[i];        }        return res;    }}

再看一种只需要遍历一次即可的解法,这个算法需要 left 和 right 两个指针分别指向数组的首尾位置,从两边向中间扫描,在当前两指针确定的范围内,先比较两头找出较小值,如果较小值是 left 指向的值,则从左向右扫描,如果较小值是 right 指向的值,则从右向左扫描,若遇到的值比当较小值小,则将差值存入结果,如遇到的值大,则重新确定新的窗口范围,以此类推直至 left 和 right 指针重合,参见代码如下:

C++ 解法二:

class Solution {public:    int trap(vector<int>& height) {        int res = 0, l = 0, r = height.size() - 1;        while (l < r) {            int mn = min(height[l], height[r]);            if (mn == height[l]) {                ++l;                while (l < r && height[l] < mn) {                    res += mn - height[l++];                }            } else {                --r;                while (l < r && height[r] < mn) {                    res += mn - height[r--];                }            }        }        return res;    }};

Java 解法二:

public class Solution {    public int trap(int[] height) {        int res = 0, l = 0, r = height.length - 1;        while (l < r) {            int mn = Math.min(height[l], height[r]);            if (height[l] == mn) {                ++l;                while (l < r && height[l] < mn) {                    res += mn - height[l++];                }            } else {                --r;                while (l < r && height[r] < mn) {                    res += mn - height[r--];                }            }        }        return res;    }}

我们可以对上面的解法进行进一步优化,使其更加简洁:

C++ 解法三:

class Solution {public:    int trap(vector<int>& height) {        int l = 0, r = height.size() - 1, level = 0, res = 0;        while (l < r) {            int lower = height[(height[l] < height[r]) ? l++ : r--];            level = max(level, lower);            res += level - lower;        }        return res;    }};

Java 解法三:

public class Solution {    public int trap(int[] height) {        int l = 0, r = height.length - 1, level = 0, res = 0;        while (l < r) {            int lower = height[(height[l] < height[r]) ? l++ : r--];            level = Math.max(level, lower);            res += level - lower;        }        return res;    }}

下面这种解法是用 stack 来做的,博主一开始都没有注意到这道题的 tag 还有 stack,所以以后在总结的时候还是要多多留意一下标签啊。其实用 stack 的方法博主感觉更容易理解,思路是,遍历高度,如果此时栈为空,或者当前高度小于等于栈顶高度,则把当前高度的坐标压入栈,注意这里不直接把高度压入栈,而是把坐标压入栈,这样方便在后来算水平距离。当遇到比栈顶高度大的时候,就说明有可能会有坑存在,可以装雨水。此时栈里至少有一个高度,如果只有一个的话,那么不能形成坑,直接跳过,如果多余一个的话,那么此时把栈顶元素取出来当作坑,新的栈顶元素就是左边界,当前高度是右边界,只要取二者较小的,减去坑的高度,长度就是右边界坐标减去左边界坐标再减1,二者相乘就是盛水量啦,参见代码如下:

C++ 解法四:

class Solution {public:    int trap(vector<int>& height) {        stack<int> st;        int i = 0, res = 0, n = height.size();        while (i < n) {            if (st.empty() || height[i] <= height[st.top()]) {                st.push(i++);            } else {                int t = st.top(); st.pop();                if (st.empty()) continue;                res += (min(height[i], height[st.top()]) - height[t]) * (i - st.top() - 1);            }        }        return res;    }};

Java 解法四:

class Solution {    public int trap(int[] height) {        Stack<Integer> s = new Stack<Integer>();        int i = 0, n = height.length, res = 0;        while (i < n) {            if (s.isEmpty() || height[i] <= height[s.peek()]) {                s.push(i++);            } else {                int t = s.pop();                if (s.isEmpty()) continue;                res += (Math.min(height[i], height[s.peek()]) - height[t]) * (i - s.peek() - 1);            }        }        return res;    }}

“C++怎么实现收集雨水”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++怎么实现收集雨水

本文链接: https://lsjlt.com/news/296210.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++怎么实现收集雨水
    本篇内容介绍了“C++怎么实现收集雨水”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Trapping Rain Water 收集雨水Give...
    99+
    2023-06-19
  • C++实现LeetCode(42.收集雨水)
    [LeetCode] 42. Trapping Rain Water 收集雨水 Given n non-negative integers representin...
    99+
    2024-04-02
  • php怎么实现ip收集
    本文操作环境:Windows7系统,PHP7.1版,Dell G3电脑。php怎么实现ip收集php获取访问者IP地址汇总在很我的时候我们需要得到用户的真实IP地址,例如,日志记录,地理定位,将用户信息,网站数据分析等,其实获取IP地址很简...
    99+
    2016-09-16
    php ip
  • C语言实现代码雨效果
    本文实例为大家分享了C语言实现代码雨效果的具体代码,供大家参考,具体内容如下 一、项目描述和最终的效果展示 项目:   让字符从上到下依次的下落,呈现出代码雨。 最终效果图...
    99+
    2024-04-02
  • CSS3怎么实现流星雨效果
    小编给大家分享一下CSS3怎么实现流星雨效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明:正文只讲述单个流星雨的实现方式,多个的效果只需要对单个的动画起始点...
    99+
    2023-06-14
  • JavaScript怎么实现字符雨效果
    今天小编给大家分享一下JavaScript怎么实现字符雨效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。具体代码如下<...
    99+
    2023-07-02
  • html流星雨代码怎么实现
    本教程操作环境:Windows10系统、HTML5版本、Dell G3电脑。html流星雨代码怎么实现?动态流星雨制作代码分享(可直接复制)流星雨制作效果图(流星带颜色的,截图没显示):今天在书上,看到了一个不错的流星雨制作案例,感觉挺好看...
    99+
    2023-05-14
    html
  • C++怎么实现水果装入果篮问题
    这篇文章主要介绍“C++怎么实现水果装入果篮问题”,在日常操作中,相信很多人在C++怎么实现水果装入果篮问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现水果装入果篮问题”的疑惑有所帮助!接下来...
    99+
    2023-06-20
  • Oracle自动收集统计信息怎么实现
    这篇文章主要介绍“Oracle自动收集统计信息怎么实现”,在日常操作中,相信很多人在Oracle自动收集统计信息怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Orac...
    99+
    2024-04-02
  • 利用python实现全屏爱心雨怎么实现
    本篇文章和大家了解一下利用python实现全屏爱心雨怎么实现。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。以下核心代码参考黑客帝国的界面的雨滴图和网友的爱心素材一 音乐播放def alarm(): &...
    99+
    2023-08-03
  • C++中怎么实现遍历集合
    C++中怎么实现遍历集合,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java中,常见的遍历集合方式如下:Iterator iter = l...
    99+
    2023-06-17
  • CSS怎么实现雨滴动画效果
    这篇文章主要介绍CSS怎么实现雨滴动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!玻璃窗今天我们要实现的是雨滴效果,不过实现雨滴前,我们先把毛玻璃的效果弄出来,没有玻璃窗,雨都进屋了,还有啥好敲打的。<d...
    99+
    2023-06-08
  • 怎么用Python实现流星雨效果
    这篇文章将为大家详细讲解有关怎么用Python实现流星雨效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。流星雨的前提是得先有一个流星,所谓流星,就是一个拖着尾巴的直线。所谓拖着尾巴,实际上是我们的浪漫想...
    99+
    2023-06-22
  • C语言如何实现流星雨效果
    小编给大家分享一下C语言如何实现流星雨效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!上次忘记说了,因为我们是用C语言写的所以是控制台程序,创造不出来界面,那怎...
    99+
    2023-06-25
  • C语言实现流星雨效果流程
    目录一、头文件二、结构体三、初始化四、绘制函数五、移动函数六、界面设计七、主函数总结视频讲解感谢序 再亮眼的流星,也会一闪而过。 嗨!这里是狐狸~~ 没错,我又来了,上次的“烟花”表...
    99+
    2024-04-02
  • php如何实现ip收集
    这篇文章给大家分享的是有关php如何实现ip收集的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php实现获取ip的方法:1、使用“$_SERVER["REMOTE_ADDR"]”获取;2、使用...
    99+
    2023-06-22
  • 怎么用html实现流星雨的效果
    小编给大家分享一下怎么用html实现流星雨的效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   <!doctypeh...
    99+
    2024-04-02
  • jquery插件怎么实现代码雨特效
    这篇文章将为大家详细讲解有关jquery插件怎么实现代码雨特效,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独特的链式语法和短...
    99+
    2023-06-14
  • ELK收集Tomcat日志的实现
    目录01 Tomcat 安装与测试02 修改 Tomcat 日志为 Json 格式03 配置 Filebeat 采集 Tomcat 日志04 使用Kibana查看Tomcat日志01...
    99+
    2024-04-02
  • 基于python实现日志收集
    脚本: #! /usr/bin/python # encoding:utf-8 import paramiko import time import os import re import codecs import commands ...
    99+
    2023-01-31
    日志 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作