Leetcode: 43. 接雨水
题目描述:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
思路分析:
思路一:这是一个类似木桶效应的问题。比较多的思路是利用单调栈来实现。之前大四上算法课的时候也做过类似的题目。维护一个单调递减的栈,当遇到大于当前栈顶的高度时,出栈,计算可接多少水,算法是取现在的栈顶元素与待进栈元素的较小高度减去这个出栈元素的高度,再乘上待进栈元素与栈顶元素的宽度。这里注意维护在栈内的元素时对应的下标,以保证能够求得正确的宽度。这个方法是逐层求可接雨水。时间复杂度为O(n^2)。
思路二:
在实际的面试过程中,肯定是希望能够优化这个算法,考虑用双指针,逐列的来取雨水。维护左右两个指针left和right,分别指向数组的头尾,同时维护两个数值,存maxleft和maxright,即当前遍历过的所有左右元素的最大高度。需要进行判断,若left的高度小于right的高度,则left++,否则right--。同时在每次判断是还需要多一次判断,即是否能够加水,需要判断当left小于right时,left是否小于maxleft,若是,那么就可以加水,所加的水为maxleft-height[left]。反之,当right小于等于left的高度时,添加maxright-height[right]的水量。这个方法的时间复杂度为O(n)。
代码:
思路一:
class Solution {
public: int trap(vector<int>& height) {
if(height.size()==)
return ;
int sum_rain = ;
stack<int> s;
for(int i=; i<height.size(); i++)
{
if(s.empty() || height[i]<height[s.top()])
s.push(i);
else
{
while(!s.empty() && height[i]>height[s.top()])
{
int pre = s.top();
s.pop();
if(!s.empty())
{
sum_rain += (min(height[i], height[s.top()])-height[pre])*(i-s.top()-);
}
}
s.push(i);
}
}
return sum_rain;
}
};
思路二:
class Solution {
public:
int trap(vector<int>& height) {
if(height.size()==)
return ;
int sum_rain = ;
int left=, right = height.size()-;
int leftmax=, rightmax=;
while(left<right)
{
if(height[left]<height[right])
{
if(height[left]<leftmax)
{
sum_rain += (leftmax-height[left]);
}
else
leftmax = height[left];
left++;
}
else
{
if(height[right]<rightmax)
{
sum_rain += (rightmax-height[right]);
}
else
rightmax = height[right];
right--; } }
return sum_rain;
}
};
Leetcode: 43. 接雨水的更多相关文章
- LeetCode:接雨水【42】
LeetCode:接雨水[42] 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1, ...
- [LeetCode] 43. Multiply Strings 字符串相乘
Given two non-negative integers num1 and num2represented as strings, return the product of num1 and ...
- LeetCode 43. 字符串相乘(Multiply Strings)
43. 字符串相乘 43. Multiply Strings 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. ...
- [LeetCode]42. 接雨水(双指针,DP)
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, ...
- [LeetCode] 43. Multiply Strings ☆☆☆(字符串相乘)
转载:43. Multiply Strings 题目描述 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的.也就是传说中的大数相乘. 解法一 我们就模仿我们在纸上做乘法的过程 ...
- LeetCode 43 Multiply Strings(字符串相乘)
题目链接: https://leetcode.com/problems/multiply-strings/?tab=Description 求解大数相乘问题 按照上图所示,进行嵌套循环计算 ...
- leetcode 42. 接雨水 JAVA
题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...
- Leetcode 407.接雨水
接雨水 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高度都大于0 且小 ...
- Leetcode 42.接雨水
接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...
随机推荐
- VIM编辑器使用的小技巧
在命令中输入 vi –t 类型名.结构体名或者函数名 系统就会寻找相应的对象,默认是在当前目录的 tags 中搜索,例如我们想寻找 stat 结构体, 则输入 vi –t stat 然后按 q 退出 ...
- FreeRTOS 任务通知模拟消息邮箱
举例 void task1_task(void *pvParameters) { u8 key; BaseType_t err; while(1) { key=KEY_Scan(0); //扫描按键 ...
- Unity手游汉化笔记①:UABE+AssetStudio编辑MonoBehavior类型Asset
总的笔记:https://www.cnblogs.com/guobaoxu/p/12055930.html 目录 一.使用工具 二.具体操作 [1]利用AssetStudio进行预览 [2]UABE修 ...
- Pandas 之 Series / DataFrame 初识
import numpy as np import pandas as pd Pandas will be a major tool of interest throughout(贯穿) much o ...
- C# 获取指定类型的文件
C# 获取指定类型的文件 public static List<FileInfo> getFile(string path, string extName) { List<FileI ...
- Copy Files from Windows 10 to wsl
Method 1 reboot( close wsl window and reopen ) Method 2 – Windows System Drive as a Mount point Wind ...
- centos7 升级最新版内核 并安装 bcc-tools
centos7 升级最新版内核 升级系统 [root@jikeshijian ~]# yum update -y 安装 ELRepo [root@jikeshijian ~]# rpm --impor ...
- C语言scanf函数转换说明表及其修饰符表
1. 对于上一篇文章,总结printf()输出,C库也包含了多个输入函数, scanf()是最常用的一个,也是经常与printf()经常一起搭配使用的函数之一. scanf()和printf()类似, ...
- 无法打开jetbrains官网
找到下面hosts文件,用记事本打开,删除关于jetbrain的文字 需要管理员权限才能操作这个文档: 先后输入cmd和 notepad hosts 删除掉关于jetbrains的模块,再次访问htt ...
- PAT 乙级 1019.数字黑洞 C++/Java
题目来源 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有 ...