Leetcode.1465 切割后面积最大的蛋糕
rating : 1445
矩形蛋糕的高度为 h h h 且宽度为 w w w,给你两个整数数组 h o r i z o n t a l C u t s horizontalCuts horizontalCuts 和 v e r t i c a l C u t s verticalCuts verticalCuts,其中:
请你按数组 h o r i z o n t a l C u t s horizontalCuts horizontalCuts 和 v e r t i c a l C u t s verticalCuts verticalCuts 中提供的水平和竖直位置切割后,请你找出 面积最大 的那份蛋糕,并返回其 面积 。由于答案可能是一个很大的数字,因此需要将结果 对 1 0 9 + 7 10^9 + 7 109+7 取余 后返回。
输入:h = 5, w = 4, horizontalCuts = [1,2,4], verticalCuts = [1,3]
输出:4
解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿色的那份蛋糕面积最大。
输入:h = 5, w = 4, horizontalCuts = [3,1], verticalCuts = [1]
输出:6
解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿色和黄色的两份蛋糕面积最大。
输入:h = 5, w = 4, horizontalCuts = [3], verticalCuts = [3]
输出:9
蛋糕的面积为
a r e a = ( h o r i z o n t a l C u t s [ i ] − h o r i z o n t a l C u t s [ i − 1 ] ) × ( v e r t i c a l C u t s [ i ] − v e r t i c a l C u t s [ i − 1 ] ) area = (horizontalCuts[i] - horizontalCuts[i - 1]) \times (verticalCuts[i] - verticalCuts[i-1]) area=(horizontalCuts[i]−horizontalCuts[i−1])×(verticalCuts[i]−verticalCuts[i−1])
用于相乘的这两项是独立的,所以我们可以先分别找到各自最大的一项,即 m a x ( h o r i z o n t a l C u t s [ i ] − h o r i z o n t a l C u t s [ i − 1 ] ) max(horizontalCuts[i] - horizontalCuts[i - 1]) max(horizontalCuts[i]−horizontalCuts[i−1]) 和 m a x ( v e r t i c a l C u t s [ i ] − v e r t i c a l C u t s [ i − 1 ] ) max(verticalCuts[i] - verticalCuts[i-1]) max(verticalCuts[i]−verticalCuts[i−1])。
再相乘就得到最终的答案了。
时间复杂度: O ( n × l o g n ) O(n \times logn) O(n×logn)
C++代码:
const int MOD = 1e9 + 7;
class Solution {
public:
int get_max_size(vector<int>& cuts , int size){
sort(cuts.begin(),cuts.end());
int ans = max(cuts[0] , size - cuts.back());
int n = cuts.size();
for(int i = 1;i < n;i++){
ans = max(ans , cuts[i] - cuts[i - 1]);
}
return ans;
}
int maxArea(int h, int w, vector<int>& horizontalCuts, vector<int>& verticalCuts) {
int max_h = get_max_size(horizontalCuts,h);
int max_w = get_max_size(verticalCuts,w);
return max_h * 1LL * max_w % MOD;
}
};