面试算法39:直方图最大矩形面积

news2024/9/27 19:26:09

题目

直方图是由排列在同一基线上的相邻柱子组成的图形。输入一个由非负数组成的数组,数组中的数字是直方图中柱子的高。求直方图中最大矩形面积。假设直方图中柱子的宽都为1。例如,输入数组[3,2,5,4,6,1,4,2],其对应的直方图如图6.3所示,该直方图中最大矩形面积为12,如阴影部分所示。
在这里插入图片描述

分析:蛮力法

如果能逐一找出直方图中所有的矩形并比较它们的面积,就能得到最大矩形面积。

解:蛮力法

public class Test {
    public static void main(String[] args) {
        int[] heights = {3, 2, 5, 4, 6, 1, 4, 2};
        int result = largestRectangleArea(heights);
        System.out.println(result);
    }

    public static int largestRectangleArea(int[] heights) {
        int maxArea = 0;
        for (int i = 0; i < heights.length; i++) {
            int min = heights[i];
            for (int j = i; j < heights.length; j++) {
                min = Math.min(min, heights[j]);
                int area = min * (j - i + 1);
                maxArea = Math.max(maxArea, area);
            }
        }

        return maxArea;
    }
}

分析:分治法

这个直方图中最矮的柱子在数组中的下标是5,它的高度是1。这个直方图的最大矩形有3种可能。第1种是矩形通过这根最矮的柱子。通过最矮的柱子的最大矩形的高为1,宽是7。第2种是矩形的起始柱子和终止柱子都在最矮的柱子的左侧,也就是从下标为0的柱子到下标为4的柱子的直方图的最大矩形。第3种是矩形的起始柱子和终止柱子都在最矮的柱子的右侧,也就是从下标为6的柱子到下标为7的柱子的直方图的最大矩形。第2种和第3种从本质上来说和求整个直方图的最大矩形面积是同一个问题,可以调用递归函数解决。

解:分治法

public class Test {
    public static void main(String[] args) {
        int[] heights = {3, 2, 5, 4, 6, 1, 4, 2};
        int result = largestRectangleArea(heights);
        System.out.println(result);
    }

    public static int largestRectangleArea(int[] heights) {
        return helper(heights, 0, heights.length);
    }

    private static int helper(int[] heights, int start, int end) {
        if (start == end) {
            return 0;
        }

        if (start + 1 == end) {
            return heights[start];
        }

        int minIndex = start;
        for (int i = start + 1; i < end; i++) {
            if (heights[i] < heights[minIndex]) {
                minIndex = i;
            }
        }

        int area = (end - start) * heights[minIndex];
        int left = helper(heights, start, minIndex);
        int right = helper(heights, minIndex + 1, end);

        area = Math.max(area, left);
        return Math.max(area, right);
    }
}

分析: 单调栈法

由于已经计算了以每根柱子为顶的最大矩形面积,因此比较这些矩形面积就能得到直方图中的最大矩形面积

解:单调栈法

public class Test {
    public static void main(String[] args) {
        int[] heights = {3, 2, 5, 4, 6, 1, 4, 2};
        int result = largestRectangleArea(heights);
        System.out.println(result);
    }

    public static int largestRectangleArea(int[] heights) {
        Stack<Integer> stack = new Stack<>();
        stack.push(-1);

        int maxArea = 0;
        for (int i = 0; i < heights.length; i++) {
            while (stack.peek() != -1 && heights[stack.peek()] >= heights[i]) {
                int height = heights[stack.pop()];
                int width = i - stack.peek() - 1;
                maxArea = Math.max(maxArea, height * width);
            }

            stack.push(i);
        }

        while (stack.peek() != -1) {
            int height = heights[stack.pop()];
            int width = heights.length - stack.peek() - 1;
            maxArea = Math.max(maxArea, height * width);
        }

        return maxArea;
    }
}

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

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

相关文章

前后端交互系统:在Node.js中运行JavaScript

在Node.js中运行JavaScript&#xff0c;您需要编写适用于服务器端的代码&#xff0c;而不是浏览器端的代码。以下是一些示例代码&#xff0c;用于在Node.js中创建一个简单的HTTP服务器并在浏览器中访问它&#xff1a; // 引入Node.js内置的http模块 const http require(http);…

华为ERP,包含哪些内容?技术的先进性体现在哪里?

华为作为全球领先的信息和通信技术&#xff08;ICT&#xff09;解决方案提供商&#xff0c;其企业资源规划&#xff08;ERP&#xff09;系统是一个高度复杂且集成的管理软件平台&#xff0c;用于优化公司内部的业务流程和资源分配。华为ERP系统包括一系列模块和功能&#xff0c…

pytest-yaml 测试平台-2.支持上传YAML格式用例

前言 pytest-yaml 测试平台用例结构是遵循pytest-yaml-yoyo 框架用例规则。 如果你之前已经有用 pytest-yaml-yoyo 框架完成了yaml 用例的编写&#xff0c;可以直接在平台上导入yaml 用例。 yaml 用例 test_用例文件a.yml config:name: 单个用例文件test_a:name: extract提…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第三章 多线程服务器的适用场合与常用编程模型

本文中的多线程服务器指运行在Linux上的独占式网络应用程序。硬件平台为Intel x86-64系列的多核CPU&#xff0c;单路或双路SMP&#xff08;Symmetric Multi-Processing&#xff0c;对称多处理&#xff0c;它是一种多核处理器架构&#xff0c;其中多个CPU核心共享系统的内存和其…

(三)行为模式:10、策略模式(Strategy Pattern)(C++示例)

目录 1、策略模式&#xff08;Strategy Pattern&#xff09;含义 2、策略模式的UML图学习 3、策略模式的应用场景 4、策略模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现策略模式的实例 6、策略模式解析 1、策略模式…

解决报错:gnutls_handshake() failed: The TLS connection was non-properly terminated.

执行git clone的时候&#xff0c;出现错误&#xff1a;gnutls_handshake() failed: The TLS connection was non-properly terminated. 如图&#xff1a; 解决方式&#xff1a; 两次重置代理&#xff1a;完美解决 git config --global --unset https.https://github.com.pro…

批量编辑 Outlook 联系人

现状 Outlook 自带的联系人编辑功能无法快速、批量编辑联系人字段使用 Excel 等外部编辑器&#xff0c;可批量编辑联系人 导出联系人到文件 在【联系人】界面&#xff0c;点击【文件】在【文件】界面&#xff0c;点击【打开和导出】–>【导入/导出】在弹出的向导窗口中点…

[C国演义] 第十七章

第十七章 摆动序列最长递增子序列的个数 摆动序列 力扣链接 子序列 ⇒ dp[i]的含义: 以nums[i] 为结尾的所有子序列中的 摆动序列中的最长长度子序列 ⇒ 状态转移方程: 最后一个元素的构成 初始化: 都初始化为 1 遍历方向: 从前往后返回结果: f表 和 g表中的最大值 class …

解决Typora闪退、文件打不开等问题——Typora免费使用教程(也有免费版的)

问题描述&#xff1a; 下好Typora之后打开会闪退&#xff0c;程序运行一会之后就自己关闭了&#xff0c;显示出一片空白&#xff0c;以前写的文件也打不开。 经过一番搜索&#xff0c;发现大佬的文章&#xff0c;给出了很详细的原因分析、解决过程&#xff1b; 具体参考如下&…

【1.2】神经网络:神经元与激活函数

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 神经网络&#xff08;随缘更新&#xff09; ✨特色…

[数据结构]-二叉搜索树

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、二叉搜…

利用Linux socat快速搭建TCP服务器

某些场合&#xff0c;需要在Linux上快速搭建一个TCP的服务器&#xff0c;接收客户端的连接&#xff0c;返回一些数据。 一般用于测试或者负载不大&#xff0c;安全性要求不高的场合&#xff0c;达到快速搭建的目的。 本文以客户端通过服务器的3334端口&#xff0c;获取服务器…

什么是残差网络结构

大家好啊&#xff0c;我是董董灿。 在我刚开始学习AI算法时&#xff0c;有一次参加一个线下的讨论&#xff0c;有个西南大学的本科生&#xff0c;在做汇报时说到了残差网络具有很好的推理效果。 那时的我还未入门&#xff0c;像是听天书&#xff0c;听了半天没搞懂说的啥意思…

【c++】模拟实现优先级队列(priority_queue)

全部代码 以容器适配器的玩法来实现&#xff0c;底层容器默认为vector 使用了模板参数T表示存储在队列中的元素类型&#xff0c;Container表示底层容器类型&#xff0c;默认为vector&#xff0c;Compare表示比较器类型&#xff0c;默认为less。 adjustDown函数用于向下调整堆…

高速下载b站视频的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C语言】关于char的取值范围的讨论

前提知识&#xff1a; 计算机内存中存的是整数的补码。 正数的原反补相同&#xff01; 负数的补码 &#xff08;除符号位以外&#xff09;原码取反 1 负数的源码 &#xff08;除符号位以外&#xff09;补码取反 1 有符号的char&#xff0c;最高位二进制位表示符号位 …

基于 MTAOO 方法论,看连锁餐饮品牌如何落地 CJO 理念、实现精细化用户运营

移动互联网时代的流量红利已经消失&#xff0c;企业亟需在数字化转型时代抓住触点红利&#xff0c;基于客户旅程编排&#xff08;Customer Journey Orchestration&#xff0c;简称 CJO&#xff09;为用户提供个性化、全渠道一致的体验。 在此背景下&#xff0c;连锁餐饮品牌已经…

《C和指针》笔记34:字符串函数

文章目录 1. 获取字符串长度strlen 2. 复制字符串strcpystrncpy 3. 拼接字符串strcatstrncat 4. 字符串比较strcmpstrncmp 1. 获取字符串长度 strlen 库函数strlen的原型如下&#xff1a; size_t strlen( char const *string );注意strlen返回一个类型为size_t的值。这个类型…

【GIT】:一文快速了解什么是GIT

【GIT】&#xff1a;一文快速了解什么是GIT 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; 关于版本控制 什么是“版本控制”&#xff1f;我为什么要关心它呢&#xff1f; 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来…

使用数组实现队列

目录 队列的应用场景 任务调度 广度优先搜索&#xff08;BFS&#xff09; 网络请求管理 消息队列 当我们在编写JavaScript代码时&#xff0c;经常会遇到需要使用队列的情况。队列是一种常见的数据结构&#xff0c;它按照先进先出&#xff08;First-In-First-Out&#xff0…