algorithm - 找到所有子数组的最大子数组
问题描述
给定一个二进制数组(元素为 0 或 1),我需要找到数组中给定范围(l 和 r)全为 1 的子数组的最大长度。
我知道查找此类子数组的 O(n) 方法,但如果有 O(n) 查询,则整体复杂性变为 O(n^2)。
我知道段树用于此类问题,但我不知道如何为这个问题构建树。
我是否可以构建一个分段树,使用它可以在 log(n) 时间内回答查询,这样对于 O(n) 查询的整体复杂性将变为 O(nlog(n))。
解决方案
让A
成为你的二进制数组。
构建两个数组IL
和IR
:
-IL
按顺序包含每个i
这样的A[i] = 1 and (i = 0 or A[i-1] = 0)
;
-IR
按顺序包含每一个i
这样的A[i-1] = 1 and (i = N or A[i] = 0)
。
换句话说,对于任何i
,由IL[i]
包含和IR[i]
不包含定义的范围对应于 中的1
s序列A
。
现在,对于任何查询{L, R}
(对于范围 [L; R] 包括在内),让S = 0
. 遍历IL
和IR
,i
直到IL[i] >= L
。此时,如果IR[i-1] > L
,设置S = IR[i-1]-L
。继续遍历IL
和IR
,设置S = max(S, IR[i]-IL[i])
,直到IR[i] > R
。最后,如果IL[i] <= R
,设置S = max(S, R-IL[i])
。
S
现在是 和 之间的最大s序列1
的大小。A
L
R
构建IL
和的复杂度IR
是O(N)
,回答查询的复杂度是O(M)
,M
长度为IL
or IR
。
推荐阅读
- python-3.x - Python3 中的 Crypto Reverse Shell - cd 命令不会更改目录
- c# - 在代码分析器中正确定义属性并公开使用项目?
- laravel - Eloquent:在链式 whereHas() 中使用中间表
- python - 熊猫重新采样时间序列数据 - 同一列上有多个 agg 函数?
- python - 如何在 WxPython Grid 中设置单元格高度
- java - Swing Designer 中的 Intellij FlatLAF 在编译后的应用程序中不起作用
- python - 当我在 VsCode 中运行 python 文件时出现修改消息,虽然我已经安装了 Python
- laravel - SQLSTATE [HY000]:一般错误:1364 字段 'user_id' 在 laravel 8 上没有默认值
- c# - Quartz.net Scheduler.Shutdown(true) 不杀死作业
- yii2-advanced-app - 如何在 Yii2 应用程序中使用 Swiftmailer 发送经过身份验证的电子邮件?