总水量问题
BM94 trapWater()
描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)
数据范围:数组长度 0 \le n \le 2\times10^50≤n≤2×105,数组中每个值满足 0 < val \le 10^90<val≤109 ,保证返回结果满足 0 \le val \le 10^9 \0≤val≤109
要求:时间复杂度 O(n)O(n)
示例1
输入:
[3,1,2,5,2,4]
复制返回值:
5
复制说明:
数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 ,如题面图。
示例2
输入:
[4,5,1,3,2]
复制返回值:
2
解答
class Solution{
public class trapWater(int[] heights){
if(height.length<=2)return 0;
int result,lMax,rMax=0;
int n=height.length;
//本质上是双指针的快慢指针方法,通过一个快指针的每一次遍历来实现慢指针所对应的量/面积/体积的准确值;
for(int i=1;i<n-1;i++){
// 找右边最高的bar;
for(int j=i;j<n;j++){rMax=Math.max(rMax,height[j]);}
// 找左边最高的bar;
for(int j=i;j>=0;j--){lMax=Math.max(lMax,height[j]);}
result+=Math.min(lMax,rMax)-height[i];
}
return result;
}
}
最大水量问题
BM93 maxArea
描述
给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水
1.你不能倾斜容器
2.当n小于2时,视为不能形成容器,请返回0
3.数据保证能容纳最多的水不会超过整形范围,即不会超过231-1
数据范围:
0<=height.length<=10^50<=height.length<=105
0<=height[i]<=10^40<=height[i]<=104
解法
import java.util.*;
public class Solution {
public int maxArea(int[] bar) {
int n = bar.length;
int iL = 0;
int iR = n - 1;
int result = 0;
//本质上是双指针的同向不同步问题,用于解决最值问题;
while (iL < iR) {
int area = Math.min(bar[iL], bar[iR]) * (iR - iL);
result = Math.max(result, area);
if (bar[iL] < bar[iR])
iL++;
else
iR--;
}
return result;
}
}