列表

详情


1465. 切割后面积最大的蛋糕

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

请你按数组 horizontalCuts verticalCuts 中提供的水平和竖直位置切割后,请你找出 面积最大 的那份蛋糕,并返回其 面积 。由于答案可能是一个很大的数字,因此需要将结果  109 + 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

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int maxArea(int h, int w, vector<int>& horizontalCuts, vector<int>& verticalCuts) { } };

rust 解法, 执行用时: 12 ms, 内存消耗: 4.1 MB, 提交时间: 2023-10-27 00:05:45

impl Solution {
    pub fn max_area(h: i32, w: i32, horizontal_cuts: Vec<i32>, vertical_cuts: Vec<i32>) -> i32 {
        let (mut maxh,mut maxw) = (0,0);//i32
        let mut horizontal_cuts = horizontal_cuts;
        let mut vertical_cuts = vertical_cuts;
        horizontal_cuts.sort();
        vertical_cuts.sort();

        let mut last = 0;
        for cur  in horizontal_cuts {
            maxh = if cur-last > maxh { cur-last} else { maxh };
            last = cur;
        }
        maxh = if h -last > maxh { h -last } else { maxh };
        
        last = 0;
        for cur  in vertical_cuts {
            maxw = if cur-last > maxw { cur-last} else { maxw };
            last = cur;
        }
        maxw = if w -last > maxw { w -last} else { maxw };
        //println!("{}{}",maxh,maxw);
        let  result:i64 = (maxh as i64)*(maxw as i64);
        (result%1000000007) as i32
    }
}

javascript 解法, 执行用时: 144 ms, 内存消耗: 53 MB, 提交时间: 2023-07-23 10:30:16

/**
 * @param {number} h
 * @param {number} w
 * @param {number[]} horizontalCuts
 * @param {number[]} verticalCuts
 * @return {number}
 */
var maxArea = function (h, w, horizontalCuts, verticalCuts) {
  const MOD = 1000000007n

  let maxH = fun(horizontalCuts, h)
  let maxW = fun(verticalCuts, w)
  
  return (maxH * maxW) % MOD
};

const fun = (nums, end) => {
  nums.sort((a, b) => a - b)
  let max = BigInt(nums[0])
  for (let i = 1; i < nums.length; i++) {
    const sub = BigInt(nums[i]) - BigInt(nums[i - 1])
    max = sub > max ? sub : max
  }
  max = BigInt(end - nums[nums.length - 1]) > max ? BigInt(end - nums[nums.length - 1]) : max

  return max
}

golang 解法, 执行用时: 64 ms, 内存消耗: 8 MB, 提交时间: 2023-07-23 10:28:30

func maxArea(h int, w int, horizontalCuts []int, verticalCuts []int) int {
	sort.Ints(horizontalCuts)
	sort.Ints(verticalCuts)
	mr,mc:=horizontalCuts[0]-0,verticalCuts[0]-0
	for i:=1;i<len(horizontalCuts);i++{
		mr=max(mr,horizontalCuts[i]-horizontalCuts[i-1])
	}
	for j:=1;j<len(verticalCuts);j++{
		mc=max(mc,verticalCuts[j]-verticalCuts[j-1])
	}
	mr=max(mr,h-horizontalCuts[len(horizontalCuts)-1])
	mc=max(mc,w-verticalCuts[len(verticalCuts)-1])
	return (mr%1000000007)*(mc%1000000007)%1000000007
}

func max(a, b int) int { if a > b { return a }; return b }

python3 解法, 执行用时: 104 ms, 内存消耗: 33.3 MB, 提交时间: 2023-07-23 10:26:40

class Solution:
    def maxArea(self, h: int, w: int, horizontalCuts: List[int], verticalCuts: List[int]) -> int:
        temp_h = [0]+sorted(horizontalCuts)+[h]
        temp_x = [0]+sorted(verticalCuts)+[w]
        temp_h = [temp_h[i+1]-temp_h[i] for i in range(len(temp_h)-1)]
        temp_x = [temp_x[i+1]-temp_x[i] for i in range(len(temp_x)-1)]
        return max(temp_h)*max(temp_x)%(10**9+7)

cpp 解法, 执行用时: 64 ms, 内存消耗: 31.6 MB, 提交时间: 2023-07-23 10:25:49

class Solution {
public:
    using ll = long long;
    static constexpr int mod = 1e9 +7;
    int maxArea(int h, int w, vector<int>& horizontalCuts, vector<int>& verticalCuts) {
        //排序
        sort(horizontalCuts.begin(),horizontalCuts.end());
        sort(verticalCuts.begin(),verticalCuts.end());
        int hei=0,wei=0;
        int pre=0;
        for(auto i : horizontalCuts){
            hei = max(hei,i-pre);
            pre=i;
        }
        hei = max(hei,h-pre);   // 比较当前高度与下边界的距离
        pre=0;
        for(auto  i : verticalCuts){
            wei = max(wei,i-pre);
            pre=i;
        }
        wei=max(wei,w-pre);     // 比较当前高度与右边界的距离
        return ((ll)hei*wei) % mod; //注意转long long,否则会溢出
    }
};

java 解法, 执行用时: 15 ms, 内存消耗: 52.5 MB, 提交时间: 2023-07-23 10:24:56

/**
 * 分别找出长和宽的最大值(这里的长和宽指相邻两个切割位置之差),乘积即为面积最大值。
 * 注意 需要补充验证边界切割位置。
 **/
class Solution {
    public int maxArea(int h, int w, int[] horizontalCuts, int[] verticalCuts) {
        long horizonMax = 0, verticalMax = 0;
        
        int mod = 1000000007;
        Arrays.sort(horizontalCuts);
        Arrays.sort(verticalCuts);
            
        for (int i = 1; i < horizontalCuts.length; i++) {
            horizonMax = Math.max(horizonMax, horizontalCuts[i] - horizontalCuts[i - 1]);
        }
        // 补充验证边界切割位置
        horizonMax = Math.max(horizonMax, horizontalCuts[0] - 0);
        horizonMax = Math.max(horizonMax, h - horizontalCuts[horizontalCuts.length - 1]);
            
        for (int i = 1; i < verticalCuts.length; i++) {
            verticalMax = Math.max(verticalMax, verticalCuts[i] - verticalCuts[i - 1]);
        }
        // 补充验证边界切割位置
        verticalMax = Math.max(verticalMax, verticalCuts[0] - 0);
        verticalMax = Math.max(verticalMax, w - verticalCuts[verticalCuts.length - 1]);
            
        return (int) ((horizonMax * verticalMax) % mod);
    }
}

上一题