【卡码网】32. 子矩形的最大面积
给定一个矩形,宽度为 W,高度为 H,现需要对其进行划分。现有一个数组 yCutting 用于表示在水平方向上用于切分矩形的切线位置,另有一个数组 xCutting 表示在垂直方向上用于切分矩形的切线位置。求被切割后的所有子矩形中最大的那块的面积。
输入
第一行 H:矩形的高度
第二行 W:矩形的宽度
第三行:yCutting 数组的长度
第四行:yCutting 数组
第五行:xCutting 数组的长度
第六行:xCutting 数组
输出
一个整数,表示最大的那块子矩形的面积。
样例输入
5
4
3
1 2 4
2
1 3
样例输出
4
提示
0 < H < 50000;
0 < W < 50000;
0 < yCutting.length < 100;
0 < xCutting.length < 100.
题解
分别求宽和长中切割的最大区间,把俩个最大区间相乘
import java.lang.*;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 读取矩形的高度和宽度
int H = in.nextInt();
int W = in.nextInt();
// 读取水平 yCutting 数组的长度和内容
int yCuttingLength = in.nextInt();
int[] yCutting = new int[yCuttingLength];
for (int i = 0; i < yCuttingLength; i++) {
yCutting[i] = in.nextInt();
}
// 读取垂直 xCutting 数组的长度和内容
int xCuttingLength = in.nextInt();
int[] xCutting = new int[xCuttingLength];
for (int i = 0; i < xCuttingLength; i++) {
xCutting[i] = in.nextInt();
}
// 对水平和垂直切割数组进行排序
Arrays.sort(yCutting);
Arrays.sort(xCutting);
// 计算水平切割区间的最大值
int maxSubX = getMaxInterval(yCutting, H);
// 计算垂直切割区间的最大值
int maxSubY = getMaxInterval(xCutting, W);
// 将两个方向上的最大切割区间相乘即得到最大子矩形的面积
int maxSubArea = maxSubX * maxSubY;
System.out.println(maxSubArea);
}
// 计算最大切割区间
private static int getMaxInterval(int[] cuttingArray, int length) {
// 默认第一个切割区间从边界到第一个切割点的距离
int maxInterval = cuttingArray[0];
// 求最大间隔
for (int i = 1; i < cuttingArray.length; i++) {
maxInterval = Math.max(maxInterval, cuttingArray[i] - cuttingArray[i - 1]);
}
// 最后一个切割区间从最后一个切割点到边界的距离
maxInterval = Math.max(maxInterval, length - cuttingArray[cuttingArray.length - 1]);
return maxInterval;
}
}