1465. 切割后面积最大的蛋糕 : 为何仅需处理相邻切割位(多语言题解)

news2024/12/22 18:56:31

题目描述

这是 LeetCode 上的 「1465. 切割后面积最大的蛋糕」 ,难度为 「中等」

Tag : 「贪心」、「模拟」

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

  • horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离
  • verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离

请你按数组 horizontalCutsverticalCuts 中提供的水平和竖直位置切割后,请你找出「面积最大」的那份蛋糕,并返回其「面积」

由于答案可能是一个很大的数字,因此需要将结果 对 取余 后返回。

示例 1: alt

输入:h = 5, w = 4, horizontalCuts = [1,2,4], verticalCuts = [1,3]

输出:4 

解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿色的那份蛋糕面积最大。

示例 2: alt

输入:h = 5, w = 4, horizontalCuts = [3,1], verticalCuts = [1]

输出:6

解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿色和黄色的两份蛋糕面积最大。

示例 3:

输入:h = 5, w = 4, horizontalCuts = [3], verticalCuts = [3]

输出:9

提示:

  • 题目数据保证 horizontalCuts 中的所有元素各不相同
  • 题目数据保证 verticalCuts 中的所有元素各不相同

贪心

为了方便,记 horizontalCutshs,记 verticalCutsvs

由于求是“最大”蛋糕面积,「水平/垂直方向的连续段必然由「同方向且相邻」的切割位置(或是蛋糕边界)所构成」

这点可通过反证法证明:如果最终蛋糕的(左右或上下)边缘不是由「相邻」的切割位置(或是蛋糕边界)决定,而是由跨越某些切割点的位置所决定的话,那么这个蛋糕必不是“完整”一块。

用题面的示例 来举个 🌰,我们仅分析水平方向(hs = [1, 2, 4]):

alt

最终蛋糕的在该方向的连续段大小,只能是 [上边缘, 切割点 1][切割点 1, 切割点 2][切割点 2, 切割点 4][切割点 4, 下边缘] 四个之一,而不可能由非相邻切割点所组成,例如 [切割点 1, 切割点 4](会被 切割点 2 所一分为二,不再完整)。

因此,我们可先对 hsvs 进行排序,从而确保我们在遍历 hsvs 过程中,处理到的均为「同反向且相邻」的切割位置。

随后,利用俩方向相互独立,分别求出俩方向连续段的最大长度,两者乘积即是答案。

Java 代码:

class Solution {
    int MOD = (int)1e9+7;
    public int maxArea(int h, int w, int[] hs, int[] vs) {
        Arrays.sort(hs);
        Arrays.sort(vs);
        int n = hs.length, m = vs.length;
        int mh = Math.max(hs[0], h - hs[n - 1]), mv = Math.max(vs[0], w - vs[m - 1]);
        for (int i = 1; i < n; i++) mh = Math.max(mh, hs[i] - hs[i - 1]);
        for (int i = 1; i < m; i++) mv = Math.max(mv, vs[i] - vs[i - 1]);
        return (int)((mh * 1L * mv) % MOD);
    }
}

Python 代码:

class Solution:
    def maxArea(self, h: int, w: int, hs: List[int], vs: List[int]) -> int:
        MOD = 10 ** 9 + 7
        hs.sort()
        vs.sort()
        n, m = len(hs), len(vs)
        mh, mv = max(hs[0], h - hs[n - 1]), max(vs[0], w - vs[m - 1])
        for i in range(1, n):
            mh = max(mh, hs[i] - hs[i - 1])
        for i in range(1, m):
            mv = max(mv, vs[i] - vs[i - 1])
        return (mh * mv) % MOD

C++ 代码:

class Solution {
public:
    int maxArea(int h, int w, vector<int>& hs, vector<int>& vs) {
        int MOD = 1e9+7;
        sort(hs.begin(), hs.end());
        sort(vs.begin(), vs.end());
        int n = hs.size(), m = vs.size();
        int mh = max(hs[0], h - hs[n - 1]), mv = max(vs[0], w - vs[m - 1]);
        for (int i = 1; i < n; i++) mh = max(mh, hs[i] - hs[i - 1]);
        for (int i = 1; i < m; i++) mv = max(mv, vs[i] - vs[i - 1]);
        return (mh * 1L * mv) % MOD;
    }
};

TypeScript 代码:

function maxArea(h: number, w: number, hs: number[], vs: number[]): number {
    const MOD = BigInt(1e9 + 7);
    hs.sort((a,b)=>a-b);
    vs.sort((a,b)=>a-b);
    const n = hs.length, m = vs.length;
    let mh = Math.max(hs[0], h - hs[n - 1]), mv = Math.max(vs[0], w - vs[m - 1]);
    for (let i = 1; i < n; i++) mh = Math.max(mh, hs[i] - hs[i - 1]);
    for (let i = 1; i < m; i++) mv = Math.max(mv, vs[i] - vs[i - 1]);
    return Number((BigInt(mh) * BigInt(mv)) % MOD);
};
  • 时间复杂度:
  • 空间复杂度:

最后

这是我们「刷穿 LeetCode」系列文章的第 No.1465 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA知识框架及技术

Web应用&#xff0c;最常见的研发语言是Java和PHP。 后端服务&#xff0c;最常见的研发语言是Java和C/C。 大数据&#xff0c;最常见的研发语言是Java和Python。 可以说&#xff0c;Java是现阶段中国互联网公司中&#xff0c;覆盖度最广的研发语言&#xff0c;掌握了Java技术…

Facebook账号被封?那是因为没做对这些事

Facebook是全球最大的社交媒体平台之一&#xff0c;拥有数十亿的全球用户。它的主要产品包括Facebook&#xff08;面向个人用户的社交媒体平台&#xff09;、Instagram、WhatsApp和Messenger。同时他也是美国数字广告市场的主要参与者之一&#xff0c;其广告平台吸引了数百万广…

2023年最受欢迎的11个UI设计师网站,助你成为行业翘楚

作为一名优秀的UI设计师&#xff0c;快速寻找灵感&#xff0c;保持审美在线&#xff0c;了解行业动态绝对是一项职业必备技能。 今天小编为各位小伙伴整理了一些UI设计师必看的绝佳网站。你可以从这些网站中了解行业最新动态&#xff0c;寻找创意灵感、学习优秀作品&#xff0…

使用Python将PDF转为图片

将PDF转为图片能方便我们将文档内容上传至社交媒体平台进行分享。此外&#xff0c;转换为图片后&#xff0c;还可以对图像进行进一步的裁剪、调整大小或添加标记等操作。 用Python将PDF文件转JPG/ PNG图片可能是大家在一些项目中会遇到的需求&#xff0c;下面将详细介绍如何使用…

LibreOffice怎么调整标题和段落之间的间距

今天用LibreOffice创建新文档&#xff0c;标题和段落之间的距离太大了&#xff0c;浪费空间&#xff1a; 如果想缩小距离的话&#xff0c;可以进行调整。 点击右侧导航栏的“属性”图标&#xff1a; 光标放在标题上&#xff1a; 在属性窗口&#xff0c;点击设置行距的下…

专业140+总分400+合工大合肥工业大学833信息通信上岸分享

我初试总分400&#xff0c;专业833是140&#xff0c;对于成绩还是比较满意&#xff0c;希望自己的复习经验对大家有所帮助。 近年分数线情况 合工大通信近几年分数线波动较大&#xff0c;有些大小年倾向&#xff0c;今年学硕和专硕都在320分左右&#xff0c;但是复录比增加为…

Android 开发调试时连接手机5037端口被占用的问题解决

原理是根据端口查询pid并结束占用了5037端口的进程。 步骤&#xff1a; 1.使用cmd命令行查看被占用端口所对应的 PID 输入命令&#xff1a;netstat -aon|findstr “端口号” 现在要找到使用了5037端口的进程&#xff0c;那么就是netstat -aon|findstr "5037" 结…

TreeMap 源码解析

目录 一. 前言 二. 源码解析 2.1. 成员属性 2.2. 构造方法 2.3. 添加元素 2.4. 获取元素 2.5. 是否包含key 2.6. 删除元素 三. 总结 一. 前言 TreeMap 基于红黑树实现&#xff0c;这为 TreeMap 保持键的有序性打下了基础。总的来说&#xff0c;TreeMap 的核心是红黑树…

基础课10——人工智能的基础:大数据

人工智能和大数据是相互依存、相互促进的关系。 大数据是人工智能的重要基础&#xff0c;没有大数据&#xff0c;人工智能就难以发挥其作用。同时&#xff0c;人工智能也提供了处理和分析大数据的工具和方法&#xff0c;使得大数据能够得到更有效的利用。 在应用方面&#xf…

RK3568-适配at24c04模块

将at24c04模块连接到开发板i2c2总线上 i2ctool查看i2c2总线上都有哪些设备 UU表示设备地址的从设备被驱动占用,卸载对应的驱动后,UU就会变成从设备地址。at24c04模块设备地址 0x50和0x51是at24c04模块i2c芯片的设备地址。这个从芯片手册上也可以得知。A0 A1 A2表示的是模块对…

编程案例:ps5游戏厅计时计费管理系统软件

编程案例&#xff1a;ps5游戏厅计时计费管理系统软件 一、佳易王电玩PS5游戏厅计时计费软件部分功能简介&#xff1a; 1、计时计费功能 &#xff1a;开台时间和所用的时长直观显示&#xff0c;每3秒即可刷新一次时间。 2、销售商品功能 &#xff1a;商品可以绑定桌子最后一起…

将输入的字符串中小写字母改为大写字母

#include<stdio.h> void main() {char str[50];printf("input string:>");gets(str);int i 0;while (str[i] ! \0){if (str[i] > a && str[i] < z){str[i] str[i] - 32;}i;}printf("%s",str); } 不用scanf是因为scanf遇到空格和回…

Screw Puzzle - Nuts and Bolts

Unblock screws and untangle each twisted iron piece from the jigsaw of obstacles Support Email : 825407372qq.com

在线分享的批量智能管理技巧

在现代社会中&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;随着时间的推移&#xff0c;我们电脑中的文件越来越多&#xff0c;管理起来也变得越来越困难。为了提高工作效率&#xff0c;我们需要学会高效管理电脑文件。下面&#xff0c;我将分享一…

家居行业EDI:爱室丽Ashley EDI 项目案例

爱室丽Ashley&#xff08;Ashley Furniture Industries&#xff09;&#xff0c;是一家美国家居用品制造商和零售商。目前爱室丽Ashley通过两个分销渠道销售家居用品和配件&#xff1a;独立家具经销商和700多家Ashley Furniture HomeStore零售家具店&#xff0c;在中国、越南、…

【23真题】暴涨45分是专业课简单?还是太卷?

哈喽大家好&#xff0c;现在这个时间节点&#xff0c;有很多同学开始刷真题了&#xff01;所以23真题系列正式启动&#xff01;小马哥将全面发布23真题及详细解析&#xff01; 今天分享的是23年南京信息工程大学811的信号与系统试题及解析。南信大23年分数数涨45分&#xff0c…

yum--centos 和apt --ubuntu

centos安装软件 搜索语法&#xff1a;yum -y search 软件名称 安装软件前可以先去搜一下看看能用yum中有这个软件吗 安装语法&#xff1a;yum -y install 软件名称 写上 -y 意思是不用手动确认&#xff0c;直接安装 卸载语法&#xff1a;yum -y remove 软件名称 注…

BUUCTF LSB 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;解压得到一张png图片。 密文&#xff1a; 解题思路&#xff1a; 1、根据题目的提示&#xff0c;这道题涉及LSB隐写。使用StegSolve工具打开flag11.png文件&#xff0c;打开Analyse&#xff0…

数据抓取可以应用到哪些行业

随着互联网的发展&#xff0c;数据已经成为人们生活中不可或缺的一部分。数据抓取作为获取数据的重要手段之一&#xff0c;也被广泛应用于各个行业。本文将探讨数据抓取在各个行业中的应用。 首先&#xff0c;让我们来了解一下数据抓取的基本概念。数据抓取是指通过一定的技术…

产教融合共发展 | 开源网安高校合作战略再下一城

10月25日&#xff0c;开源网安继中山大学、电子科技大学、湖北大学、大连理工大学等高校之后再次建立校企合作项目&#xff0c;与绵阳城市学院签署战略合作协议&#xff0c;开源网安产学研协同发展战略迈出重要一步&#xff0c;目前已覆盖华北、东北、华南、华中、西南等区域&a…