class Solution {
public:
int maxArea(int h, int w, vector<int>& horizontalCuts, vector<int>& verticalCuts) {
}
};
1465. 切割后面积最大的蛋糕
矩形蛋糕的高度为 h
且宽度为 w
,给你两个整数数组 horizontalCuts
和 verticalCuts
,其中:
horizontalCuts[i]
是从矩形蛋糕顶部到第 i
个水平切口的距离verticalCuts[j]
是从矩形蛋糕的左侧到第 j
个竖直切口的距离请你按数组 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
提示:
2 <= h, w <= 109
1 <= horizontalCuts.length <= min(h - 1, 105)
1 <= verticalCuts.length <= min(w - 1, 105)
1 <= horizontalCuts[i] < h
1 <= verticalCuts[i] < w
horizontalCuts
中的所有元素各不相同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); } }