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的整数.每一个单位的高 ...
随机推荐
- 双线性插值算法的FPGA实现
本设计预实现720P到1080P的图像放大,输入是YUV444数据,分量像素位宽为10bit,采用的算法为双线性插值法,开发平台是xiinx K7开发板. 双线性插值法即双次线性插值,首先在横向线性插 ...
- 【Mysql】InnoDB 引擎中的页目录
一.页目录和槽 接上一篇,现在知道记录在页中按照主键大小顺序串成了单链表. 那么我使用主键查询的时候,最顺其自然的办法肯定是从第一条记录,也就是 Infrimum 记录开始,一直向后找,只要存在总会找 ...
- Mysql 基础用法
#创建表 CREATE TABLE table_name (column_name int) CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` ...
- Java 中 this 和 super 的用法详解
前言 这次我们来回顾一下this和super这两个关键字的用法,作为一名Java程序员,我觉得基础是最重要的,因为它决定了我们的上限,所以我的文章大部分还是以分享Java基础知识为主,学好基础,后面的 ...
- SQL SERVER 按时间计算每天某值的平均值
在报表需求中,有针对求每天按时间分配数据的平均值,在经过查找后,找到一种方法,供参考. 1.新建视图 2.编写语句 SELECT TOP (100) PERCENT AVG(dbo.漕盈日运行.CO ...
- 关于XP系统因以下文件的损坏或丢失,WINDOWS无法启动:\windows\system32\config\system的解决思路实践
故事背景:在合肥项目中,现场一台使用超过6年的工控机,在近段时间内出现上述标题中出现的系统文件丢失问题 ,该问题重启复现,无法通过传统进入安全模式或者最后一次正确配置等方式进行修复,只能通过将repa ...
- JAVA,IDEA下的包机制
IDEA下的包机制 在实际开发中,大型系统往往需要多人合作完成,每个程序员都要命名多个类与接口等类型,难免会定义重复的类与接口.为了避免名字冲突,java提供了包机制只要包名不同,即使类名相同,也能相 ...
- CentOS 永久修改系统时间
1.查看当前系统时间 date 2.修改当前系统时间 date -s "2018-2-22 19:10:30 3.查看硬件时间 hwclock --show ...
- 探索HashMap源码 一行一行解析 jdk1.7版本
今天我们来说一说,HashMap的源码到底是个什么? 面试大厂这方面一定会经常问到,很重要的.以jdk1.7 为标准 先带着大家过一遍 是由数组.链表组成 , 数组的优点是:每个元素有对应下标, ...
- Java面向对象04——构造器
类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的.并且构造器有以下两个特点: 必须和类的名字相同 必须没有返回值,也不能写void package oop.demon01.demon02 ...