- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址:https://leetcode-cn.com/problems/maximum-area-of-a-piece-of-cake-after-horizontal-and-vertical-cuts/
題目描述
矩形蛋糕的高度爲 h
且寬度爲 w
,給你兩個整數數組 horizontalCuts
和 verticalCuts
,其中 horizontalCuts[i]
是從矩形蛋糕頂部到第 i
個水平切口的距離,類似地, verticalCuts[j]
是從矩形蛋糕的左側到第 j
個豎直切口的距離。
請你按數組 horizontalCuts
和 verticalCuts
中提供的水平和豎直位置切割後,請你找出 面積最大 的那份蛋糕,並返回其 面積 。由於答案可能是一個很大的數字,因此需要將結果對 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, 10^5)
1 <= verticalCuts.length < min(w, 10^5)
1 <= horizontalCuts[i] < h
1 <= verticalCuts[i] < w
- 題目數據保證
horizontalCuts
中的所有元素各不相同 - 題目數據保證
verticalCuts
中的所有元素各不相同
題目大意
本題給出了一個矩形,並給出了橫豎很多切割線,求切割得到最大矩形面積。
解題方法
找最大間隔之積
第一想法是暴力:對每個橫豎切割線兩兩組合,求出組合出的所有矩形的最大的面積。該方法的時間複雜度是 O(M * N)
,M 和 N 分別爲橫豎切割線的個數,看了題目給出的 M 和 N 都是 10^5 量級,想乘就是 10^10 量級,會超時。
既然不能暴力求解,就必須優化。稍加思索,不難想到:找出切割線中 最大行間隔 和 最大列間隔,兩者相乘就是最大矩形面積。
原因是:每一個 行間隔 都跟所有的 列間隔 相交,每一個 列間隔 也都跟所有的 行間隔 相交,而且他們都是正數。
用數學表述就是在
1 <= horizontalCuts[i] <= max(horizontalCuts)
,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月的開始,兒童節快樂!