- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
题目地址:https://leetcode-cn.com/problems/string-to-integer-atoi/
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.
Theabove elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]
.
Inthis 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
给定n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
让我们求总的能接多少雨水,这个题有两种解法,一种是每个位置都去判断能接多少雨水,一种是每个区间去判断接多少雨水。
最简单的暴力解法,求每个位置的储水量:
1、 遍历每个位置,找到这个位置左边和右边的最高柱子高度;
2、 求两个最高柱子中取最矮的高度(短板效应,短板决定盛水量);
3、 减去当前柱子的高度就是储水量;
这个时间复杂度是O(N^2),会超时。
C++代码如下。
class Solution {
public:
int trap(vector<int>& height) {
const int N = height.size();
int res = 0;
auto begin = height.begin();
auto end = height.end();
for (int i = 0; i < N; ++i) {
int left_max = *max_element(begin, begin + i + 1);
int right_max = *max_element(begin + i, end);
res += min(left_max, right_max) - height[i];
}
return res;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
在上面的暴力解法中,我们知道在每个位置都要求其左右的最大柱子的高度,因此是不是可以更快速的求出来这个值呢?
在很多题目里面,都有这种做法,为了能找出每个位置左右的最大值,可以提前计算并保存。比如,使用left_max和right_max数组,分别保存每个位置的左右两边的最大高度。计算时包含了当前位置,目的是防止出现两边的柱子比当前的位置矮,减的时候出现负值。
使用两边的高度的最小值 - 当前柱子的高度就是该位置的储水量。
C++代码如下:
class Solution {
public:
int trap(vector<int>& height) {
const int N = height.size();
int res = 0;
vector<int> left_max(N, 0);
vector<int> right_max(N, 0);
for (int i = 0; i < N; ++i) {
left_max[i] = i == 0 ? height[i] : max(left_max[i - 1], height[i]);
}
for (int i = N - 1; i >= 0; --i) {
right_max[i] = i == N - 1 ? height[i] : max(right_max[i + 1], height[i]);
}
for (int i = 0; i < N; ++i) {
res += min(left_max[i], right_max[i]) - height[i];
}
return res;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
如果你考虑的是一个区间能接多少雨水的话可以使用单调栈。
考虑单调栈的原因是我们从左向右看的时候,发现只有先下降、后上升的情况,才会存储水。
我们看到每次都要向左边找到左边最高的柱子,然后求这个区间内的面积。
我们看到其实是一层一层的向上累计的。
那么,我们使用一个单调递减栈,每次遇到一个新的位置,都把栈中的元素遍历出来,找出所有的比当前位置矮的,累积计算这部分面积。
计算面积公式:(两柱子的最小高度 - 两柱子之间的最大高度)* 距离
。
C++代码如下:
class Solution {
public:
int trap(vector<int>& height) {
const int N = height.size();
if (N < 3) return 0;
int res = 0;
stack<int> st;
int idx = 0;
while (idx < N) {
if (st.empty() || height[idx] <= height[st.top()]) {
st.push(idx);
idx ++;
} else {
int last = st.top(); st.pop();
if (st.empty()) continue;
int distance = idx - st.top() - 1;
res += distance * (min(height[st.top()], height[idx]) - height[last]);
}
}
return res;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
我想捕获 CtrL+c 和 CtrL+\,然后将下面的 cmd 添加到我的脚本中: trap _trapException SIGINT SIGQUIT function _trapException
在 Javascript 中,如果我尝试这样做: var obj = {}; obj.z.c.f.d = 'foo'; `TypeError: Cannot read property 'c' of
我所有的脚本中都有一个通用的trap{},用于处理和记录所有不可预见的异常,而这些异常本来不是通过Try/catch处理的。 这很好。 但是,当我有一个带有Windows窗体的脚本时,所有异常都将
我只是想知道它们之间的基本区别。 我在一些地方发现,TRAP本质上也被称为软件中断,或者类似异常的东西。 软件中断和异常之间的基本区别是什么。 软件中断可以通过INT指令产生,但是TRAP只能在某些情
我只是想知道它们之间的基本区别。 我在一些地方发现,TRAP本质上也被称为软件中断,或者类似异常的东西。 软件中断和异常之间的基本区别是什么。 软件中断可以通过INT指令产生,但是TRAP只能在某些情
我正在为 Spigot 编写一个类,它定义了许多新的制作配方。然而,当我调用一个事件时,它有时会抛出一个断言错误:TRAP。我进行了很多研究,但没有发现任何有用的提示或任何东西。 项目.java pa
我有一个范围a(起始范围)和一个范围b(目标范围),我需要缩放一个值aX从范围 a 到范围 b。代码是基本的线性插值: double LinearInterpolation(double a0, do
我在网页末尾发现了一些奇怪的标记,有人可以告诉我这是做什么用的吗? --> 这是一个中文网站:http://mp.weixin.qq.com/s?__biz=MjM5ODMwMzExNQ=
所以首先,我在使用 Java 的 100 级 CS 大学类(class)中。我们的任务是制作一款塔防游戏,我在寻路方面遇到了麻烦。我通过搜索发现 A* 似乎是最好的。虽然当我在路径上放置一个 U 时,
我正在 Windows 中开发一个运行时非 native 二进制翻译器,到目前为止,我已经能够通过使用一个丑陋的使用 Windows SEH 处理无效中断的 hack;但只是因为系统调用 vector
我有一个网格(如下例),其中包含外墙(标记为 W)、环境 block (E)、开放空间 (o) 和事件点 (A)。目前,此网格存储在 [,] 中,其中包含与给定点关联的所有数据。我试图确定是否包含一个
精简版 在 Bash 脚本中,我激活了一个陷阱,然后通过调用 trap - EXIT ERR SIGHUP SIGINT SIGTERM 停用它。 .当我直接在脚本中进行停用时,它可以工作。但是,当我
我试图使用 trap "echo resized" SIGWINCH 检测我的菜单何时调整大小但它似乎没有检测到它。我目前使用的是 ubuntu 20.04,并且我正在使用 bash 脚本来执行此操作
使用 SNMP4J 创建的陷阱发送方中的 privProtocol 3DES、AES192 和 AES256 V3 陷阱发送失败。发生异常情况如下: org.snmp4j.MessageExcepti
我正在编写一个脚本,在启动服务之前等待一堆目录存在。它基本上由一个无限循环组成,该循环在末尾中断,或者在找不到任何需要的目录时继续。简化后,算法本身看起来像 loop_while_false() {
由于 this question,我正在尝试在函数中使用 trap ,并提出了这个次要问题。给定以下代码: d() { trap 'return' ERR false echo
我有一个错误陷阱如下: trap failed ERR function failed { local r=$? set +o errtrace set +o xtrace
如果我的系统上使用了一些命令,我想检测它们。出于这个原因,我在我的 Linux 机器上使用 auditd。但是我不知道是否可以检测到 trap 命令的使用。 也许你能帮帮我 非常感谢 最佳答案 “
我想使用我自己的陷阱监听器来获取 snmp 陷阱。事实上,我使用了在互联网上找到的代码,我添加了一些修改,现在它可以工作了。我可以通过162端口监听。 #include "stdio.h" #incl
我的一个 friend 在尝试调试开始显示“对齐陷阱”错误的代码时遇到了一个大问题。当特定函数访问全局结构时会出现问题。 在网络上进行一些研究后,仍然不清楚“对齐陷阱”是什么意思或是什么。有人可以给出
我是一名优秀的程序员,十分优秀!