LeetCode 42接雨水 按行求解(差分+排序)
按行求解的思路比较清晰明了,但是这个方法的复杂度高达O(heightSize*sum(height[i])),几乎高达O(N^2)。
但是也并不是不可以解决,经观察我们可以发现,这个算法的缺点在于要遍历每一个柱体的每一个高度,所以解决的时就要从这个点着手。
设之前已经存在的柱体的最高高度为bp,当前柱体的高度为h,则如果h<=bp,说明该高度和它以下的高度已经出现过,我们更新该高度的end位置(end一直增加,所以不需要比较)。
但是,如果bp<h,说明只有bp以下的高度之前出现过,我们只能更新bp高度以下柱体的end,对于高于bp的,我们记录它的第一次出现位置,就是当前位置i。
对于更新end数组,我们定义一个结构体node,存放不同高度柱体对应的end和它本身的高度,因为我们之后要排序。
更新完成node结构体数组,按照end降序排序,对于end是不会相同的,所以不用考虑end相同时的情况。
此时node数组中的第一个end就是最右边的end,并且带有对应的高度h,此时小于等于高度h的柱体的右边界就确定下来,这时小于等于h的答案就可以求出来了,我们之后就不用求小于这个高度h的答案了。
定义一个cur_height表示已经求过的高度,后面的node中存放的情况有两种,第一种是高度小于cur_height的,说明,之前也出现过这个高度,但是出现的位置比较靠前,不与考虑。
第二种情况就是,高度大于cur_height的,说明,在此之前有高度更高的柱体出现过,求解cur_height+1~node[i].height即可。
对于每一层的方块数,差分求就可以了啦。。。。
献上代码,瞎搞写法,开心,,,,
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=1e5+10;
int cnt[maxn],beg[maxn];
struct Node {
int end,h;
}node[maxn];
bool cmp(const Node &a,const Node &b)
{
return a.end>b.end;
}
class Solution {
public:
int trap(vector<int>& height) {
memset(node,0,sizeof(node));
memset(cnt,0,sizeof(cnt));
int ans=0,size=height.size();
int bp=0,p;
for (int i=0;i<size;i++) {
if (height[i]) {
cnt[1]++;
cnt[height[i]+1]--;
}
p=min(bp,height[i]);
node[p].h=p;
node[p].end=i;
for (int j=bp+1;j<=height[i];j++) {
beg[j]=i;
}
if (bp<height[i]) {
bp=height[i];
}
}
int add=0;
for (int i=1;i<=bp;i++) {
add+=cnt[i];
cnt[i]=add;
}
sort(node,node+bp+1,cmp);
int cur_height=0;
for (int i=0;node[i].end;i++) {
if (node[i].h>cur_height) {
for (int j=cur_height+1;j<=node[i].h;j++) {
ans+=node[i].end-beg[j]+1-cnt[j];
}
cur_height=node[i].h;
}
}
return ans;
}
};
LeetCode 42接雨水 按行求解(差分+排序)的更多相关文章
- Java实现 LeetCode 42 接雨水
42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这 ...
- LeetCode(42.接雨水)多解法详解
接雨水解法详解: 题目: 基本思路:从图上可以看出要想接住雨水,必须是凹字形的,也就是当前位置的左右两边必须存在高度大于它的地方,所以我们要想知道当前位置最多能存储多少水,只需找到左边最高处max_l ...
- [LeetCode]42. 接雨水(双指针,DP)
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, ...
- leetcode 42. 接雨水 JAVA
题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...
- Leetcode 42.接雨水
接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...
- Leetcode 42 接雨水 双指针
地址 https://leetcode-cn.com/problems/trapping-rain-water/ 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能 ...
- LeetCode 42. 接雨水(Trapping Rain Water)
题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况 ...
- 每日一题 LeetCode 42.接雨水 【双指针】
题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目说明 题解 主要方法:双指针 + 正反遍历 解释说明: 正向遍历:先确定池子左 ...
- LeetCode:接雨水【42】
LeetCode:接雨水[42] 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1, ...
随机推荐
- 更新centos本地仓库(换源)
/etc/yum.repos.d/CentOS-Base.repo 1,首先进行备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...
- Codeforces Round #600 (Div. 2) D。 Harmonious Graph
#include<iostream> using namespace std ; ; int p[N]; int cnt; int find(int x) { if(p[x]!=x) p[ ...
- 手机app测试要点(复制文)
一.简介 移动应用App已经渗透到每个人的生活.娱乐.学习.工作当中,令人激动.兴奋且具有创造性的各种App犹如雨后春笋般交付到用户手中.各类智能终端也在快速发布,而开发者对于全球移动设备的质量和性能 ...
- Windows下解决github push failed (remote: Permission to userA/XXXX.git denied to userB.) 上传gitHub失败报错
Windows环境下解决 github push failed (remote: Permission to userA/XXXX.git denied to userB.) · 初学GitHub的朋 ...
- C++-对象指针的滥用
C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: Object *myObject = new Object; 而不是使用: myObject.testFunc(); ...
- linux异常 - 弹出界面 eth0:设备eth0似乎不存在
问题描述: 用VMware vSphere Client复制虚拟机之后,出现这个问题 解决方法: service network stop service NetworkManager restart
- shell内置命令和外部命令的区别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...
- Git-免密提交
全局设置git免密提交,打开git-bash输入命令: git config credential.helper store --global 单独对某个项目仓库设置时不加 --global 设置之 ...
- leetcode 925. Long Pressed Name
判定是否长按 var isLongPressedName = function (name, typed) { var i = 1, j = 0, n = name.length, m = typed ...
- android toolbar 显示返回按钮并改变按钮颜色
<android.support.design.widget.AppBarLayout android:id="@+id/about_appbar" android:layo ...