当前位置: 首页 > wzjs >正文

西安个人建网站84yn页面访问升级

西安个人建网站,84yn页面访问升级,郑州中森网站建设,新手编程入门先学什么题目链接:42. 接雨水 - 力扣(LeetCode) 这里我们可以用两种方法去解决巧妙地解决这个题。首先来看一下题目 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。…

题目链接:42. 接雨水 - 力扣(LeetCode)

这里我们可以用两种方法去解决巧妙地解决这个题。首先来看一下题目

题目描述

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

示例 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

提示:

  • n == height.length

  • 1 <= n <= 2 * 104

  • 0 <= height[i] <= 105

题目作答

核心解题思想

        解决此问题的根本在于,对于数组中的任意一个位置 i,其上方能够积蓄的雨水高度,取决于它左侧所有柱子中的最高者 (left_max) 和右侧所有柱子中的最高者 (right_max) 中较矮的那一个。这个较矮的高度决定了该位置的水位。

  • 该位置 i 的最终水位高度为:water_level = min( left_max, right_max)。
  • 该位置 i 本身能存储的雨水量为:water[i] = water_level - height[i]。(如果结果为负数,则该处蓄水量为0)

我们的目标就是求出所有位置的蓄水量的值再相加


方法一:动态规划

此方法通过预计算,直观地实现了上述核心思想。

思路

  1. 预计算左侧最大高度:创建一个数组 left_max_arr,长度与 height 相同。从左到右遍历 height 数组,对于每个位置 i,left_max_arr[i] 存储从索引 0 到 i 的所有柱子中的最大高度。
  2. 预计算右侧最大高度:创建另一个数组 right_max_arr。这一次,我们从右到左遍历 height 数组,对于每个位置 i,right_max_arr[i] 存储从索引 i 到 n-1 的所有柱子中的最大高度。
  3. 计算总雨水量:当我们拥有了每个位置的左侧最高和右侧最高之后,就可以进行第三次遍历。对于每个位置 i,其水位就是 min(left_max_arr[i], right_max_arr[i])。用这个水位减去当前柱子的高度 height[i],就是该位置的蓄水量。将所有位置的蓄水量累加起来,即为最终答案。

图片来源:毒瘤面试题:接雨水_哔哩哔哩_bilibili

复杂度分析

  • 时间复杂度: O(n)。我们进行了三次独立的线性遍历,总时间复杂度为 O(n)+O(n)+O(n)=O(n)。
  • 空间复杂度: O(n)。我们使用了两个长度为 n 的额外数组 left_max_arr 和 right_max_arr 来存储中间计算结果。

代码如下

class Solution {
public:int trap(vector<int>& height) {int n = height.size();if (n < 3) {return 0;}// 1. left_max_arr 数组,记录从左到右的最大值vector<int> left_max_arr(n);left_max_arr[0] = height[0];for (int i = 1; i < n; ++i) {left_max_arr[i] = max(left_max_arr[i - 1], height[i]);}// 2. right_max_arr 数组,记录从右到左的最大值vector<int> right_max_arr(n);right_max_arr[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; --i) {right_max_arr[i] = max(right_max_arr[i + 1], height[i]);}// 3. 遍历每个位置,计算并累加雨水int total_water = 0;for (int i = 0; i < n; ++i) {// 计算当前位置的水位int water_level = min(left_max_arr[i], right_max_arr[i]);// 累加当前位置的蓄水量total_water += water_level - height[i];}return total_water;}
};

方法二:分治法

此方法是动态规划解法的空间优化版本,它在一次遍历中就完成了所有计算,无需额外的存储数组。

思路

第一步:找到全局最高点

        首先,我们需要一次遍历整个 height 数组,找到其中最高的柱子的高度 max_height 和其对应的索引 max_index。这个最高的柱子就像一座山峰,它自然地将整个地形分成了左、右两个部分。在它左边的区域,积水情况最多只会受到它本身以及它左边的墙的影响;同理,右边的区域也是如此。

第二步:处理左半部分(从数组开头到最高点)

        现在,我们从数组的最左边(索引 0)开始,向右遍历直到最高点所在的索引 max_index。

  • 我们维护一个变量 left_max,用来记录从左边到当前位置为止遇到的最高墙体。
  • 对于这个区间的任何一根柱子 height[i],它右边的最高墙一定是我们第一步找到的全局最高点 max_height。
  • 因此,在该位置 i 的蓄水高度瓶颈,就完全取决于其左边的最高墙 left_max。因为 left_max 不可能超过 max_height。
  • 所以,在位置 i 的蓄水量就是 left_max - height[i]。
  • 我们从左向右遍历,不断更新 left_max 并累加每个位置的蓄水量。

第三步:处理右半部分(从数组末尾到最高点)

        处理完左边,我们用完全对称的逻辑来处理右半部分。

  • 我们从数组的最右边(索引 n-1)开始,向左遍历直到最高点所在的索引 max_index。
  • 我们维护一个变量 right_max,用来记录从右边到当前位置为止遇到的最高墙体。
  • 对于这个区间的任何一根柱子 height[i],它左边的最高墙一定是全局最高点 max_height。
  • 因此,在该位置 i 的蓄水高度瓶颈,就完全取决于其右边的最高墙 right_max。
  • 我们在遍历过程中,不断更新 right_max 并累加每个位置的蓄水量 right_max - height[i]。

将第二步和第三步计算出的蓄水量相加,就得到了最终的总量。

复杂度分析

  • 时间复杂度: O(n)。
  • 空间复杂度: O(1)。
class Solution {
public:int trap(vector<int>& height) {int n = height.size();if (n < 3) {return 0;}// 1. 找到全局最高点int max_height = 0;int max_index = 0;for (int i = 0; i < n; ++i) {if (height[i] > max_height) {max_height = height[i];max_index = i;}}int total_water = 0;// 2. 处理左半部分 (从 0 到 max_index)int left_max = 0;for (int i = 0; i < max_index; ++i) {// 更新左侧遇到的最高墙left_max = max(left_max, height[i]);// 计算当前位置的蓄水量并累加total_water += left_max - height[i];}// 3. 处理右半部分 (从 n-1 到 max_index)int right_max = 0;for (int i = n - 1; i > max_index; --i) {right_max = max(right_max, height[i]);total_water += right_max - height[i];}return total_water;}
};


文章转载自:

http://9aEupQ6B.bwdnx.cn
http://YBDP23fx.bwdnx.cn
http://v8nkyiDw.bwdnx.cn
http://5wGE02je.bwdnx.cn
http://f37mPw4T.bwdnx.cn
http://t4k8e6p0.bwdnx.cn
http://4VcekNNJ.bwdnx.cn
http://ywxDD0Wi.bwdnx.cn
http://ngUJXxKf.bwdnx.cn
http://6j15V0hE.bwdnx.cn
http://LzqO9zMA.bwdnx.cn
http://A5YDXpMx.bwdnx.cn
http://5eetq1LH.bwdnx.cn
http://3ZdLecPg.bwdnx.cn
http://3hqPKQLI.bwdnx.cn
http://51kIMNUc.bwdnx.cn
http://YXJ7PEJm.bwdnx.cn
http://jNywIUtq.bwdnx.cn
http://yCH89Vx0.bwdnx.cn
http://ymNXopfD.bwdnx.cn
http://xJYtmLdO.bwdnx.cn
http://hgWiKJnI.bwdnx.cn
http://fFDlt62n.bwdnx.cn
http://ipdhk3oo.bwdnx.cn
http://JToUxTVk.bwdnx.cn
http://Zf76RPKl.bwdnx.cn
http://WShRqS9P.bwdnx.cn
http://sCJW9pX3.bwdnx.cn
http://9Oy3ZPdG.bwdnx.cn
http://6fuqKYLr.bwdnx.cn
http://www.dtcms.com/wzjs/756525.html

相关文章:

  • 平面设计培训网站网站优化 济南
  • 课程网站建设的目标网站开发的前端和后端有哪些框架
  • 基于php的网站设计与实现做美工参考网站
  • 襄阳php网站开发怎么做网站源码
  • 制作公司网站一般多久能好最近新闻大事件
  • 网站开发实践实验报告免费的ppt通用模板
  • 旅游网站的设计与实现开题报告电子商务网站建设与全程实例
  • 网站建设方案书 阿里云html5单页网站
  • 2018年政务公开与网站建设总结哪里有放网站的免费空间
  • 合肥做网站加盟自己主机做多个网站
  • 公司做网站需准备资料网站消耗流量
  • 网站培训培训班网站备案资质
  • 论文查重网站建设wordpress nginx配置
  • wordpress建企业网站设置一图读懂制作网站
  • 网站建设百度索引wordpress标签云怎么添加
  • 深圳印刷画册seo外链工具有用吗
  • vps 网站能打开做推广效果哪个网站好
  • 广州seo网站排名广州网站设计素材
  • 专门做隐形眼镜的网站wordpress获取站点副标题
  • 佛山做网站业务工资wordpress 关闭更新警告
  • 想花钱做网站怎么做app推广
  • 个人网站类型郑州网站建设蝶动
  • 网站建设丨找王科杰上词快低价网站建设行业现状
  • 萍乡土建设计网站高端访问
  • 广州网站推广平台鲜花网站开发与设计
  • 凡科网做网站好吗徐州建设工程交易网张周
  • 机关 网站 建设方案360浏览器下载
  • wordpress设置标题大小百度搜索优化怎么做
  • 网站建设开发综合实训报告网站接入银联支付怎么做
  • 网站后台管理是做一些什么WordPress验证问题