最大化直方图下的矩形区域

2023-12-07

我有一个具有整数高度和恒定宽度 1 的直方图。我想最大化直方图下的矩形区域。 例如。:

 _
| |
| |_ 
|   |
|   |_
|     |

答案是 6, 3 * 2,使用 col1 和 col2。

O(n^2) 蛮力对我来说很清楚,我想要一个 O(n log n) 算法。我试图按照最大递增子序列 O(n log n) 算法来思考动态规划,但我不会继续前进。我应该使用分治算法吗?

PS:如果没有这样的解决方案,请有足够声誉的人删除分而治之的标签。

在 mho 的评论之后:我的意思是完全适合的最大矩形的面积。 (感谢 j_random_hacker 的澄清:))。


上面的答案在代码中给出了最好的 O(n) 解决方案,但是,他们的解释很难理解。使用堆栈的 O(n) 算法一开始对我来说似乎很神奇,但现在它对我来说完全有意义。好吧,让我解释一下。

第一个观察:

找到最大矩形(如果对于每个条形)x,我们知道其每一侧的第一个较小的条形,比方说l and r,我们确信height[x] * (r - l - 1)是我们可以通过使用酒吧高度获得的最佳镜头x。下图中,1和2是5中第一个较小的。

好吧,假设我们可以在 O(1) 时间内为每个柱完成此操作,那么我们可以在 O(n) 时间内解决这个问题!通过扫描每个条。

enter image description here

那么,问题来了:对于每个柱,我们真的能在 O(1) 时间内找到其左侧和右侧第一个较小的柱吗?这似乎不可能吧? ...通过使用递增堆栈是可能的。

为什么使用递增堆栈可以跟踪左侧和右侧第一个较小的堆栈?

也许告诉您增加堆栈可以完成这项工作根本没有说服力,所以我将引导您完成这一点。

首先,为了保持堆栈增加,我们需要一个操作:

while x < stack.top():
    stack.pop()
stack.push(x)

然后您可以在递增堆栈中检查(如下所示),对于stack[x], stack[x-1]是其左侧第一个较小的元素,然后是可以弹出的新元素stack[x]out 是其右侧第一个较小的。

enter image description here

仍然无法相信 stack[x-1] 是 stack[x] 左侧第一个较小的?

我用反证法来证明。

首先,stack[x-1] < stack[x]是肯定的。但我们假设stack[x-1]不是左边第一个较小的stack[x].

那么第一个较小的在哪里fs?

If fs < stack[x-1]:
    stack[x-1] will be popped out by fs,
else fs >= stack[x-1]:
    fs shall be pushed into stack,
Either case will result fs lie between stack[x-1] and stack[x], which is contradicting to the fact that there is no item between stack[x-1] and stack[x].

因此 stack[x-1] 必须是第一个较小的。

Summary:

增加堆栈可以跟踪每个元素左侧和右侧第一个较小的元素。利用这个性质,直方图中的最大矩形可以通过使用堆栈在 O(n) 中求解。

恭喜!这确实是一个棘手的问题,我很高兴我平淡的解释没有阻止你完成。附件是我经过验证的解决方案作为您的奖励:)

def largestRectangleArea(A):
    ans = 0
    A = [-1] + A
    A.append(-1)
    n = len(A)
    stack = [0]  # store index

    for i in range(n):
        while A[i] < A[stack[-1]]:
            h = A[stack.pop()]
            area = h*(i-stack[-1]-1)
            ans = max(ans, area)
        stack.append(i)
    return ans
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大化直方图下的矩形区域 的相关文章

  • 压缩很多小字符串的算法?

    我正在寻找一种压缩小 ASCII 字符串的算法 它们包含大量字母 但也可以包含数字和很少的特殊字符 它们很小 平均约为 50 100 字节 最多 250 个字节 例子 Android show EditText setError above
  • 用于计算有向图上非循环路径数量的快速算法

    简而言之 我需要一个fast计算简单有向图中有多少条非循环路径的算法 By simple我的意思是没有自环或多重边的图 Apath可以从任何节点开始 并且必须在没有传出边的节点上结束 一条路径是acyclic如果没有边出现两次 我的图 经验
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • 在Python中确定句子中2个单词之间的邻近度

    我需要确定 Python 句子中两个单词之间的接近度 例如 在下面的句子中 the foo and the bar is foo bar 我想确定单词之间的距离foo and bar 确定之间出现的单词数foo and bar 请注意 该词
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

    我想用 C 实现上述两种图像重采样算法 双三次和 Lanczos 我知道现有的实现有几十种 但我仍然想制作自己的实现 我之所以这么做 部分原因是我想了解它们是如何工作的 部分原因是我想为它们提供一些主流实现中没有的功能 例如可配置的多 CP
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • java中的Anagram算法

    我想做字谜算法但是 这段代码不起作用 我的错在哪里 例如 des 和 sed 是字谜 但输出不是字谜 同时我必须使用字符串方法 不是数组 public static boolean isAnagram String s1 String s2
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • 读取4个点的坐标。他们做一个正方形吗?

    我计算点之间的距离 如果距离相等 则点构成一个正方形 否则不 仅当我按以下顺序读取坐标 A x y B x y C x y D x y 或相反时 我的代码才有效 但是如果我这样读 例如 A x y B x y D x y C x y 它将不
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 找到一个恰好出现了 N/2 次的数字

    这是我的面试问题之一 给定一个包含 N 个元素的数组以及元素出现的位置正好 N 2次 其余 N 2 个元素是unique 您如何找到运行时间更好的元素 请记住 元素未排序 您可以假设 N 是偶数 例如 input array 10 2 3
  • 哪种算法可以有效地找到路径一定距离内的一组点?

    给定一组点s 一组 x y 坐标 和由连接一组点的线段组成的路径l 描述一种有效的算法 可用于从s在指定距离内d路径的l 其实际应用可能是查找沿城市之间的公路旅行路径 10 英里内任意位置的餐馆列表 For example in the f
  • 二分查找问题? [复制]

    这个问题在这里已经有答案了 可能的重复 实施二分查找有哪些陷阱 https stackoverflow com questions 504335 what are the pitfalls in implementing binary se

随机推荐

  • R 中的空间自相关分析 (Global Moran's I)

    我有一个点列表 我想使用 Moran s I 并通过将感兴趣的区域除以 4 x 4 样方来检查自相关性 现在我在谷歌上找到的每个例子 例如http www ats ucla edu stat r faq morans i htm 使用某种测
  • 噩梦 JS 不工作

    我知道问题的标题看起来很模糊 但仅此而已 我在我的生产服务器上安装了nodejs 其中phantomjs工作正常 然后我通过安装了噩梦npm install nightmare 我可以在node modules中看到它 我尝试了开发人员在g
  • 如何在选择时突出显示菜单项? [复制]

    这个问题在这里已经有答案了 如何在选择时突出显示菜单项 我尝试使用各种属性修改 styles xml 例如colorPressedHighlight colorActivatedHighlight等 有没有办法让菜单项保持焦点 直到选择其他
  • 在脚本仍在执行时显示结果

    现在为了看到结果 我必须等到整个代码执行完毕 它会挂起直到完成并保持加载状态 一旦完成 它就会显示我正在寻找的所有信息 在脚本仍在运行时是否有办法显示此信息 所以说 如果我在代码顶部的某个地方有一个打印 我希望它在调用时显示 而不是在脚本执
  • 更新 imageView swift 4 的高度约束时无法同时满足约束

    我有一个stack view如下图所示 所以我改变了高度image以编程方式使其适合从我的服务器下载的图像 如果没有图像 则高度限制image将设置为零 这是我这样做的代码 let imageUrl URL string imageStri
  • 查找 CSV 文件/Pandas Dataframe 中标题行的行号

    我正在尝试获取 CSV 文件中包含标题的行的索引或行号 问题是 标题行可以根据我们系统的报告输出上下移动 我无法控制更改此设置 code ht pd read csv file csv test ht get loc Code Code b
  • 如何使用实体框架核心更新与普通 SQL 更新查询相同的多条记录列表?

    通常在 SQL 中我们可以写这样的查询UPDATE users SET isAdult 1 WHERE age gt 18 我想对实体框架核心中满足某些条件的所有行进行一些编辑 我写了这段代码 但出现错误 List
  • tomcat 中基于 JSP Web 应用程序表单的身份验证

    我已将我的应用程序配置为使用基于表单的身份验证 并在 server xml 中设置所需的设置 当我尝试访问受保护的页面时 我被正确重定向到登录页面 在登录页面上 我提供了正确的用户名和密码 但它没有让我登录 而是显示登录错误页面 我正在使用
  • password_hash 每次返回不同的值

    我正在制作一个登录系统 我想对密码进行哈希处理以使其更安全 但它每次都会返回不同的哈希值 甚至无法使用password verify 进行验证 这是我的代码 password password hash password4 PASSWORD
  • 让用户上传并运行Javascript有哪些风险

    如果您有一个 HTML5 游戏厅 允许用户上传一个使用 HTML5 和 Javascript 运行游戏的脚本 假设您的输入没有过滤器 除了只允许 JS 和 HTML 那么潜在的安全风险是什么 陷阱 一种不太可能的可能性是 如果游戏很受欢迎
  • 内部服务器错误

    我在远程服务器上的同一文件夹中有一个 HTML 文件和一个 PHP 文件 从 URL 中 我调用 HTML 文件 而 HTML 文件在提交表单时调用 PHP 文件 但进展并不顺利 当我提交表单时 它显示错误 500内部服务器错误 您要查找的
  • 如何使用 MapReduce API 在映射到云存储之前过滤数据存储数据?

    关于代码实验室here 我们如何在 MapReduce 作业中过滤数据存储数据 而不是获取特定实体类型的所有对象 在下面的映射器管道定义中 唯一的一个输入读取器参数是要处理的实体类型 我在 InputReader 类中看不到可以提供帮助的类
  • Selenium Python:如何网络抓取元素文本

    我正在尝试从轮盘赌游戏中抓取数据 在努力的同时 find element by class name roulette round result position text 我得到这个输出
  • 如何拆分 git repo 并应用 Maven 子模块和 Maven 父模块?

    我需要一些关于如何配置多个存储库的建议 以便它们共享 Maven 父级 并且还配置为 Maven 根项目中的子模块 我正在维护开源项目简单的Java邮件由于可选功能变得越来越大 我计划将项目分成子模块 每个子模块都有自己的 GIT 存储库
  • 如何在方面内使用 ajc 构建参数?

    我需要知道方面内 jar 的名称 以便我可以通过 DeclareParents 创建一个字符串字段 我知道我可以将内容传递给 ajc 编译器 但实际上是否可以使用方面传递的参数 最终结果应该是带有附加字段的类 其中包含我的 jar 的名称作
  • Android 2.2 中的 BackupManager 和 BackupAgent

    我已经查看了文档和示例 BackupRestore 应用程序 并编写了自己的测试应用程序来实现android backupAgent 我延长了BackupAgent类 因为我主要关心的是能够从数据库备份数据 我似乎甚至无法让一个简单的概念验
  • 为什么在非最终类中使用普通 val

    如果课程不是最后一堂课 可能会延长 值有两种可能性 它可能被覆盖并且应该是惰性的 它可能不会被覆盖并且应该是最终的 如果 val 是最终的 您可以假设对它的所有计算都将通过类层次结构进行 如果 val 可能被覆盖 你应该声明它是惰性的 以免
  • 像内置 WP7 一样的图像/照片库

    我正在寻找适用于 Windows Phone 7 的照片库 它的外观和工作方式与内置照片查看器相同 使用轻拂操作幻灯片照片 使用捏合 拖动调整大小 当您轻拂图像时 您可以看到它滑动到下一个图像 并将列表捕捉到该图像 我已经为图像构建了调整大
  • 正则表达式包括字母数字和 _

    我正在尝试创建一个正则表达式来匹配字母数字字符和下划线 这是我的正则表达式 w s 我的印象是这个正则表达式意味着任何字母数字字符 w 下划线 和不 或空格 它是否正确 正则表达式被读取为实际匹配字符串中字符的模式 从左到右 因此您的模式实
  • 最大化直方图下的矩形区域

    我有一个具有整数高度和恒定宽度 1 的直方图 我想最大化直方图下的矩形区域 例如 答案是 6 3 2 使用 col1 和 col2 O n 2 蛮力对我来说很清楚 我想要一个 O n log n 算法 我试图按照最大递增子序列 O n lo