【LeetCode】1465. 切割後面積最大的蛋糕 Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts


題目地址:https://leetcode-cn.com/problems/maximum-area-of-a-piece-of-cake-after-horizontal-and-vertical-cuts/

題目描述

矩形蛋糕的高度爲 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

提示:

  1. 2 <= h, w <= 10^9
  2. 1 <= horizontalCuts.length < min(h, 10^5)
  3. 1 <= verticalCuts.length < min(w, 10^5)
  4. 1 <= horizontalCuts[i] < h
  5. 1 <= verticalCuts[i] < w
  6. 題目數據保證 horizontalCuts 中的所有元素各不相同
  7. 題目數據保證 verticalCuts 中的所有元素各不相同

題目大意

本題給出了一個矩形,並給出了橫豎很多切割線,求切割得到最大矩形面積。

解題方法

找最大間隔之積

第一想法是暴力:對每個橫豎切割線兩兩組合,求出組合出的所有矩形的最大的面積。該方法的時間複雜度是 O(M * N),M 和 N 分別爲橫豎切割線的個數,看了題目給出的 M 和 N 都是 10^5 量級,想乘就是 10^10 量級,會超時。

既然不能暴力求解,就必須優化。稍加思索,不難想到:找出切割線中 最大行間隔最大列間隔,兩者相乘就是最大矩形面積。

原因是:每一個 行間隔 都跟所有的 列間隔 相交,每一個 列間隔 也都跟所有的 行間隔 相交,而且他們都是正數。

用數學表述就是在

  1. 1 <= horizontalCuts[i] <= max(horizontalCuts)
  2. 1 <= verticalCuts[j] <= max(verticalCuts)

兩個條件的約數下,求 horizontalCuts[i] * verticalCuts[j] 最大值。

顯然答案是 max(horizontalCuts) * max(verticalCuts)

在實現的時候添加了矩形的邊界[0, h], [0, w],對 行列的切割線 進行了排序,然後遍歷求 行列的切割間隔 最大值,最後求行列最大值的乘積。

最後,注意題目要求對 10^9 + 7 取餘。

Python 代碼如下:

class Solution:
    def maxArea(self, h: int, w: int, horizontalCuts: List[int], verticalCuts: List[int]) -> int:
        horizontalCuts.append(0); horizontalCuts.append(h)
        verticalCuts.append(0); verticalCuts.append(w)
        horizontalCuts.sort()
        verticalCuts.sort()
        M, N = len(horizontalCuts), len(verticalCuts)
        max_hc = 0
        max_vc = 0
        for i in range(M - 1):
            max_hc = max(max_hc, horizontalCuts[i + 1] - horizontalCuts[i])
        for j in range(N - 1):
            max_vc = max(max_vc, verticalCuts[j + 1] - verticalCuts[j]) 
        return (max_hc * max_vc) % (10 ** 9 + 7)

歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!

日期

2020 年 6 月 1 日 —— 6月的開始,兒童節快樂!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章