【卡码网】32. 子矩形的最大面积 <模拟>

【卡码网】32. 子矩形的最大面积

给定一个矩形,宽度为 W,高度为 H,现需要对其进行划分。现有一个数组 yCutting 用于表示在水平方向上用于切分矩形的切线位置,另有一个数组 xCutting 表示在垂直方向上用于切分矩形的切线位置。求被切割后的所有子矩形中最大的那块的面积。

输入
第一行 H:矩形的高度
第二行 W:矩形的宽度
第三行:yCutting 数组的长度
第四行:yCutting 数组
第五行:xCutting 数组的长度
第六行:xCutting 数组

输出
一个整数,表示最大的那块子矩形的面积。

【卡码网】32. 子矩形的最大面积 <模拟>_第1张图片

样例输入

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;
    }
}

你可能感兴趣的:(力扣及OJ,#,模拟,java,算法,开发语言)