• 切割后面积最大的蛋糕


    切割后面积最大的蛋糕

    题记:

    矩形蛋糕的高度为 h 且宽度为 w,给你两个整数数组 horizontalCutsverticalCuts,其中:

    • horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离
    • verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离

    请你按数组 horizontalCutsverticalCuts 中提供的水平和竖直位置切割后,请你找出 面积最大 的那份蛋糕,并返回其 面积 。由于答案可能是一个很大的数字,因此需要将结果 10^9 + 7 取余 后返回。

    示例 1:在这里插入图片描述

    输入:h = 5, w = 4, horizontalCuts = [1,2,4], verticalCuts = [1,3]
    输出:4
    解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿色的那份蛋糕面积最大。

    示例 2:

    在这里插入图片描述

    输入:h = 5, w = 4, horizontalCuts = [3,1], verticalCuts = [1]
    输出:6
    解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿色和黄色的两份蛋糕面积最大。

    示例 3:

    输入:h = 5, w = 4, horizontalCuts = [3], verticalCuts = [3]
    输出:9

    提示:

    • 2 <= h, w <= 10^9
    • 1 <= horizontalCuts.length <= min(h - 1, 10^5)
    • 1 <=verticalCuts.length <= min(w - 1, 10^5)
    • 1 <= horizontalCuts[i] < h
    • 1 <= verticalCuts[i] < w
    • 题目数据保证 horizontalCuts 中的所有元素各不相同
    • 题目数据保证 verticalCuts 中的所有元素各不相同

    题目来源: https://leetcode.cn/problems/maximum-area-of-a-piece-of-cake-after-horizontal-and-vertical-cuts/description/

    解题方法:

    思路:分别找到水平和竖直两两相差距离最大的值,返回最大乘积(面积)的结果即可

    代码如下:

    class Solution {
    
        /**
         * @param Integer $h
         * @param Integer $w
         * @param Integer[] $horizontalCuts
         * @param Integer[] $verticalCuts
         * @return Integer
         */
        function maxArea($h, $w, $horizontalCuts, $verticalCuts) {
            //找到水平切口距离差最大值
            $max_h = [];
            sort($horizontalCuts);  //升序排序水平切口坐标数组
            for ($i = 0; $i < count($horizontalCuts); $i++) {
                if(($i+1) < count($horizontalCuts)){
                    $max_h[$i] = $horizontalCuts[$i+1] - $horizontalCuts[$i];   //找到每两两相邻相差的值
                }
            }
            sort($max_h);   //升序排序
            $h_max_value = end($max_h); //找到相差最大值
            $h_start = $horizontalCuts[0];  //第一个水平切口到原点的距离
            $h_end = $h - end($horizontalCuts); //蛋糕的高度与最后一个水平切口的距离
            $h_real_max_value = max($h_start,$h_end);
            $h_real_max_value = max($h_real_max_value,$h_max_value);    //找到真实的水平切口最大距离差值
    
            //找到竖直切口距离差最大值
            $max_v = [];
            sort($verticalCuts);    //升序排序竖直切口坐标数组
            for ($i = 0; $i < count($verticalCuts); $i++){
                if(($i + 1) < count($verticalCuts)){
                    $max_v[$i] = $verticalCuts[$i + 1] - $verticalCuts[$i];     //找到每两两相邻相差的值
                }
            }
            sort($max_v);   //升序排序
            $v_max_value = end($max_v); //找到相差最大值
            $v_start = $verticalCuts[0];    //第一个竖直切口到原点的距离
            $v_end = $w - end($verticalCuts);   //蛋糕的宽度与最后一个竖直切口的距离
            $v_real_max_value = max($v_start,$v_end);
            $v_real_max_value = max($v_real_max_value,$v_max_value);    //找到真实的竖直切口最大距离差值
    
            return ($h_real_max_value * $v_real_max_value) % (1e9 + 7);     //返回最大切口面积
        }
    }
    
    $h = 5; 
    $w = 4; 
    $horizontalCuts = [1,2,4]; 
    $verticalCuts = [1,3];
    $s = new Solution();
    $res = $s->maxArea($h, $w, $horizontalCuts, $verticalCuts);
    print_r($res);
    
    //输出示例:4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
  • 相关阅读:
    Flink 提交到 yarn 时 修改 yarn 的job 名称
    泛型通配符,上下限 ,生活案例介绍
    矩阵置零00
    【昇腾产品应用】英码科技EA500I基于昇腾Mind SDK实现实时人体关键点检测
    深入探索 Django Rest Framework
    Apache Shiro 配置
    String、StringBuffer和StringBuilder类的区别
    springboot+企业财务发票管理系统 毕业设计-附源码231105
    《计算机网络 - 自顶向下方法》阅读笔记
    腾讯云轻量服务器WordPress建站宝塔一键部署
  • 原文地址:https://blog.csdn.net/weixin_43741253/article/details/134079161