algorithm - 找到最大的连续间隔,使得开始和结束之间的所有数字都大于开始并且小于结束
问题描述
你给了整数数组
例如 5,3,4,3,9,4,4,6,8,6,5,7
你必须找到最大的间隔 (i,j),使得 i 和 j 之间的所有数字都大于等于 i 处的数字但小于等于 j 处的数字。数字不需要按排序顺序。i 处的数字也应小于 j 处的数字。
在上面的例子中有两个这样的间隔 3,4,3,9 和 4,4,6,8
在 3,4,3,9 - 中间两个数字 (4,3) 大于等于起始数字 (3) 但小于等于结束数字 (9) 。起始编号 (3) 也小于结束编号 (9)。
在 4,4,6,8 - 中间两个数字 (4,6) 大于等于起始数字 (4) 但小于等于结束数字 (8)。起始编号(4)也小于结束编号(8)。
解决这个问题的一种方法是检查所有大小为 n 的区间,然后是大小 n-1 ,依此类推,直到我们得到这样的区间。但我希望通过划分或征服/DP/或其他一些方法来实现高效的算法
解决方案
我们可以O(n log n)
通过将每个元素视为区间中潜在的最左侧元素来解决这个问题。对于每个这样的候选者,(1)找到右边的第一个元素低于它 - 这是可能间隔的右侧边界,因为包含这样的元素会使约束无效;(2) 找到区间中最大元素的最左侧实例(如果A[j]
允许等于其左侧的元素,则找到最右侧的实例)——这是区间可以在不使约束无效的情况下扩展的最右侧。
O(n)
我们可以使用堆栈为 中的所有元素存储 (1) 的答案。我们可以为 range-maximum-query 预处理一个结构,该结构将及时回答 (2) 的第一部分O(log n)
。一旦找到区间的最大值,如果我们在数组中有一个其实例的有序列表(我们可以O(n)
使用哈希表对其进行预处理),我们可以在O(log n)
时间区间中找到它最右边或最左边的出现。
推荐阅读
- racket - 定义:函数体只需要一个表达式,但发现了 3 个额外的部分
- asp.net - ADFS 中的依赖方与应用程序组
- python - python语法if in list函数
- java - 如何在 Eclipse 中为 Java 版本 6 制作 spring starter 项目(spring boot)?
- php - Woocommerce Square 支付插件问题
- python - 鸡蛋碎片的 Pip 安装问题导致软件包的未知安装
- dynamic - 如何在 Informatica Developer 中创建将表/视图名称作为输入并将其数据导出到平面文件的动态映射?
- python - 如果大于某个阈值,则将灰度图像中的像素着色为红色
- c# - 使用没有密钥的实体创建 OData API 端点
- android - PJSip 和运行时相机权限?