按行求解的思路比较清晰明了,但是这个方法的复杂度高达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接雨水 按行求解(差分+排序)的更多相关文章

  1. Java实现 LeetCode 42 接雨水

    42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这 ...

  2. LeetCode(42.接雨水)多解法详解

    接雨水解法详解: 题目: 基本思路:从图上可以看出要想接住雨水,必须是凹字形的,也就是当前位置的左右两边必须存在高度大于它的地方,所以我们要想知道当前位置最多能存储多少水,只需找到左边最高处max_l ...

  3. [LeetCode]42. 接雨水(双指针,DP)

    题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, ...

  4. leetcode 42. 接雨水 JAVA

    题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...

  5. Leetcode 42.接雨水

    接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...

  6. Leetcode 42 接雨水 双指针

    地址 https://leetcode-cn.com/problems/trapping-rain-water/ 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能 ...

  7. LeetCode 42. 接雨水(Trapping Rain Water)

    题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况 ...

  8. 每日一题 LeetCode 42.接雨水 【双指针】

    题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目说明 题解 主要方法:双指针 + 正反遍历 解释说明: 正向遍历:先确定池子左 ...

  9. LeetCode:接雨水【42】

    LeetCode:接雨水[42] 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1, ...

随机推荐

  1. ScrollView示例(转载)

    // 初始化var scrollView = new ccui.ScrollView(); // 设置方向scrollView.setDirection(ccui.ScrollView.DIR_VER ...

  2. AcWing 1020. 潜水员 二维费用背包

    //体积最多是j 全部为0,v>=0 //体积恰好为j f[0][0]=0,f[i]=无穷,v>=0 //体积至少是j f[0][0]=0,f[i]=无穷,体积为负数时于0取大 #incl ...

  3. 利用Cadence PCB SI分析特性阻抗变化因素

    1.概要 在进行PCB SI的设计时,理解特性阻抗是非常重要的.这次,我们对特性阻抗进行基础说明之外,还说明Allegro的阻抗计算原理以及各参数和阻抗的关系. 2.什么是特性阻抗? 2.1 传送线路 ...

  4. Lumen 实现接口 Captcha图片验证码功能

    安装 composer require youngyezi/captcha 使用 新版的包已经删除了 session 支持,完全交给业务自由选择存储方式 个人觉得这样更方便来解耦业务,尤其 Lumen ...

  5. Federal Learning(联邦学习)认知

    本人是学生党,同时也是小菜鸡一枚,撞运气有机会能够给老师当项目助理,在这个过程中肯定会学到一些有趣的知识,就在此平台上记录一下,在知识点方面有不对的还请各位指正. What(什么是联邦学习?) 联邦学 ...

  6. python面试的100题(6)

    7.请反转字符串 "aStr"? print("aStr"[::-1]) python实现字符串反转 第一种:使用字符串切片 result = s[::-1] ...

  7. 第四十篇 入门机器学习——Numpy.array的基本操作——向量及矩阵的运算

    No.1. Numpy.array相较于Python原生List的性能优势 No.2. 将向量或矩阵中的每个元素 + 1 No.2. 将向量或矩阵中的所有元素 - 1 No.3. 将向量或矩阵中的所有 ...

  8. lua 随机数 math.random()和math.randomseed()用法

    用法一:  不给范围,就随机算一个0~1之间的小数: 用法二:给一个参数,就取1~n之间的随机数 用法三:给两个参数,就取m~n之间的随机数 math.randomseed()用法:     由于C中 ...

  9. VMare安装及虚拟机的安装

    VMware安装 1.下载安装包安装 2.安装虚拟机 ![](ht p 接下来的开启虚拟机按照默认的配置 install or upgrade an existing system skip(选择跳过 ...

  10. P1908 逆序对(归并排序)

    https://www.luogu.com.cn/problem/P1908 归并排序是用来求逆序对的 归并排序的思想就是分治 #include <bits/stdc++.h> using ...