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)的更多相关文章

  1. [Swift]LeetCode42. 接雨水 | Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  2. LeetCode--042--接雨水(java版)

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

  3. leetcode 42. 接雨水 JAVA

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

  4. Leetcode42. 接雨水

    42. 接雨水 做法 考虑单独一列能生产多少贡献:用左右最大值去接这列的水 \(O(n)\) Code class Solution { public: int mx[1000000],rx[1000 ...

  5. LeetCode---42. 接雨水 (hard)

    题目:42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例: 输入:height = [0,1,0,2,1,0,1,3,2,1,2, ...

  6. 莫逸风CSDN文章目录

    『Ⅱ』-----随笔 莫逸风CSDN文章目录 The Programmer's Oath程序员的誓言-- 今天突发奇想写了一个小工具,CSDN文章目录生成器 vue去掉一些烦人的校验规则 输入npm ...

  7. leetcode 日常清单

    a:excellent几乎一次ac或只有点小bug很快解决:半年后再重刷: b:经过艰难的debug和磕磕绊绊或者看了小提示才刷出来: c:经过艰难的debug没做出来,看答案刷的: 艾宾浩斯遗忘曲线 ...

  8. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  9. Java实现 LeetCode 407 接雨水 II(二)

    407. 接雨水 II 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高 ...

随机推荐

  1. 【Java数据结构与算法】简单排序、二分查找和异或运算

    简单排序 选择排序 概念 首先,找到数组中最小的那个元素,其次,把它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个 ...

  2. element ui table表头动态筛选条件

    本文主要实现:根据el-table表格数据自动生成表头筛选条件的方法,可根据表格数据动态调整. el-table表格的表头增加筛选功能,大家平时都是怎么实现的呢?先看看官方文档的例子: 1 <t ...

  3. K8s基本概念资料

    https://www.cnblogs.com/menkeyi/p/7134460.html

  4. [JS]闭包和词法环境

    词法环境 词法环境(lexical environment)由两个部分组成: 环境记录--一个存储所有局部变量作为其属性的对象. 对外部词法环境的引用,与外部代码相关联. 全局词法环境在脚本执行前创建 ...

  5. 《鸟哥Linux私房菜》 全套视频和PDF资料—— 老段带你学鸟哥Linux视频课程

    <鸟哥的Linux私房菜-基础篇-服务器篇(第三版)>学习Linux极为经典的入门资料,但是还是很多同学难以坚持系统的看完整本书,最终以放弃而告终. 为了帮助大家更容易入门Linux,老段 ...

  6. 14Java进阶网络编程API

    1.网络协议的三要素:语义.语法和时序 语义表示要做什么,语法表示要怎么做,时序表示做的顺序. 2.网络OSI七层模型 OSI/RM 模型(Open System Interconnection/Re ...

  7. Table类

    Interpreter类, class Interpreter: public CC_INTERP_ONLY(CppInterpreter) NOT_CC_INTERP(TemplateInterpr ...

  8. php中英文字符串转字母转大小写

    <?php //转小写 function lowercase($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($ ...

  9. C语言复习(一)

    类型为void*的指针代表对象的地址,而不是类型 如果需要使用另一个源文件中定义的变量,那么只需要在定义变量前加上extern关键字 ex: extern int x;//x在其他文件中定义 左值表达 ...

  10. gitlab维护之修改clone地址

    因为配置了域名访问gitlab私有仓库,但是在项目clone这里,显示的还是ip地址,并且还带端口,每次访问,clone都需要自己修改,比较不方便. 修改方法: sudo vim /opt/gitla ...