LeetCode42. 接雨水(java)
42.接雨水
给定 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
思路一:按行求解
这是我最开始想到的一个解法,虽然提交后挂掉了,但也通过了314 / 315 个通过测试用例。就是先求高度为 1 的水,再求高度为 2 的水,再求高度为 3 的水。(代码做了详细注释)

public class A42 {
public static void main(String[] args) {
int[] str = new int[]{0,1,0,2,1,0,1,3,2,1,2,1};
System.out.println(trap(str));
}
public static int trap(int[] height) {
int count=0;
//找到数组最大值n,确定需要按行求需要求几行
int n=0;
for (int i = 0; i < height.length; i++) {
if (height[i]>n) n=height[i];
}
//计算每行能够存储的数据的值,根据最大值高度作为循环次数
for (int i = 0; i < n; i++) {
//计算第0行
count += getNum(height);
//每次将所有数据都减1,相当于第一行变成第零行
for (int j = 0; j < height.length; j++) {
height[j]=height[j]-1;
}
}
return count;
}
//计算第0行能够存储的水的数量
public static int getNum(int[] arr){
//a标记第一个大于0的数据,b标记最后一个大于0的数据
int a=0,b=arr.length;
//num标记水量
int num=0;
//找到a的值
for (int i = 0; i < arr.length; i++) {
if (arr[i]>=1){
a=i;
break;
}
}
//找到b的值
for (int i = arr.length-1; i >= 0; i--) {
if (arr[i]>=1){
b=i;
break;
}
}
//判断a-b之间小于1的即为能够存储一格水的
for (int i=a;i<=b;i++){
if (arr[i]<=0) num++;
}
return num;
}
}
思路二:按列求解
成功AC的做法。找到数组中最大值分别计算左边和右边能够存储的雨水。以下图为例,a为标记位置向右检索找到比a大于或等于的数据即b,将总数据加上(b-a-1) *a的高度,再减去ab之间的高度。b->c就是(7-3-1) *2-1-0-1=4.

public class A42Two {
public static void main(String[] args) {
int[] str = new int[]{0,1,0,2,1,0,1,3,2,1,2,1};
System.out.println(trap(str));
}
public static int trap(int[] height) {
int count=0;
//找到最大值,以及下标
int max = 0;
int max_index = 0;
for (int i = 0; i < height.length; i++) {
if (height[i] >= max) {
max = height[i];
max_index = i;
}
}
//左侧从第一个值开始找大于等于他的位置
int start = 0;
for (int i = 1; i <= max_index; i++) {
if (height[i]>=height[start]){
count += height[start]*(i-start-1);
for (int j = start+1; j < i; j++) {
count-=height[j];
}
start=i;
}
}
//右侧从第一个值开始找大于等于他的位置
int end = height.length-1;
for (int i = end-1; i >=max_index ; i--) {
if (height[i]>=height[end]){
count += height[end]*(end-i-1);
for (int j = i+1; j < end; j++) {
count-=height[j];
}
end=i;
}
}
return count;
}
}
LeetCode42. 接雨水(java)的更多相关文章
- [Swift]LeetCode42. 接雨水 | Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- LeetCode--042--接雨水(java版)
给定 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] 表示的高度图,在这种情况下 ...
- Leetcode42. 接雨水
42. 接雨水 做法 考虑单独一列能生产多少贡献:用左右最大值去接这列的水 \(O(n)\) Code class Solution { public: int mx[1000000],rx[1000 ...
- LeetCode---42. 接雨水 (hard)
题目:42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例: 输入:height = [0,1,0,2,1,0,1,3,2,1,2, ...
- 莫逸风CSDN文章目录
『Ⅱ』-----随笔 莫逸风CSDN文章目录 The Programmer's Oath程序员的誓言-- 今天突发奇想写了一个小工具,CSDN文章目录生成器 vue去掉一些烦人的校验规则 输入npm ...
- leetcode 日常清单
a:excellent几乎一次ac或只有点小bug很快解决:半年后再重刷: b:经过艰难的debug和磕磕绊绊或者看了小提示才刷出来: c:经过艰难的debug没做出来,看答案刷的: 艾宾浩斯遗忘曲线 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java实现 LeetCode 407 接雨水 II(二)
407. 接雨水 II 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高 ...
随机推荐
- 三、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的08-12示例
这一篇是学习了前2篇RegionManager关联视图,和通过不同的方式加载Module示例之后的开始进入MVVM了. 从第08示例开始,进入了MVVM部分. 从08示例开始学习Prism下的MVVM ...
- 【剑指offer】05. 替换空格
剑指 Offer 05. 替换空格 知识点:: 题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 输入:s = "We are happy.& ...
- 【LeetCode】933.最近的请求次数
933.最近的请求次数 知识点:队列: 题目描述 写一个 RecentCounter 类来计算特定时间范围内最近的请求. 请你实现 RecentCounter 类: RecentCounter() 初 ...
- Python多线程爬取某网站表情包
# 爬取网络图片import requestsfrom lxml import etreefrom urllib import requestfrom queue import Queue # 导入队 ...
- 【模拟】报名签到 luogu-4445
AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typed ...
- bootstrap与vue的区别是什么?(十七)
Bootstrap Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的前端开发框 ...
- ifix重用性模块化开发纪实(以污水处理泵站为例)
在经过多个自动化上位机的开发后,对上位机的重用开发和提高效率,减少重复工作有了一定的积累.故而产生了模块化建设上位机的思路.现从当下项目开始,研究出一套可重复利用的模块化系统. 1.点表整理 从PLC ...
- 【奇妙的JavaScript】# 1
奇妙的JavaScript 本专题整理了一些JavaScript的怪异行为,大部分都是选择题,题目都是简单的表达式.可以测试你有多了解 JavaScript,拓宽你的认知边界! 该专题计划每周更新1- ...
- Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?
作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...
- etcd raft 处理流程图系列1-raftexample
最近在看raft相关的代码和实现,发现etcd的raft模块在实现上还是比较灵活的,但缺点就是需要用户实现比较多的功能,如存储和网络等,同时带来的优点就是不会对用户的存储和传输作限制.网上对该模块的描 ...