已经做过接雨水的题解,本题略有不同,描述是给定一个数组,每个值代表对应坐标的高度,从中选择两个坐标,与x轴组成的容器能接最多的水。
输入是字符串形式【1,2,3】需要自己转换成数组。
算法:使用双指针从两边选取,哪一边坐标低哪一边移动。每次计算结果与最大值对比。
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine(); // 读取一行输入
// 去除首尾的方括号
input = input.substring(1, input.length() - 1);
// 使用正则表达式来找到所有的数字
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(input);
ArrayList<Integer> list = new ArrayList<>();
while (matcher.find()) {
// 将匹配到的数字字符串转换为整数并添加到列表中
list.add(Integer.parseInt(matcher.group()));
}
// 将ArrayList转换为数组
int[] array = list.stream().mapToInt(i -> i).toArray();
Integer[] array = list.toArray(new Integer[0]); // 自动分配新数组
// // 输出转换后的数组
// for (int i = 0; i < array.length; i++) {
// System.out.print(array[i]);
// if (i < array.length - 1) {
// System.out.print(", ");
// }
// }
System.out.println(maxArea(array));
}
public static int maxArea(Integer[] height) {
int maxWater = 0;
int left = 0;
int right = height.length - 1;
while (left < right) {
int currentWater = Math.min(height[left], height[right]) * (right - left);
maxWater = Math.max(maxWater, currentWater);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxWater;
}
}