【发布时间】:2022-12-11 17:15:45
【问题描述】:
标签: arrays bit-manipulation operators bitwise-operators
标签: arrays bit-manipulation operators bitwise-operators
对于两位(或位模式)a、b,当a=b时,我们只有a&b = a|b。所以你要求最大的子数组,其中所有条目都包含相同的值。
如果用子数组表示数组的切片,那么这意味着找到某个值的最长运行。扫描数组 A[] 并在辅助数组中记录当前值的重复次数。伪代码:
val = A[0]
count = 1
for i = 1 to A.length - 1 do
if A[i] = val then
++count
else
val = A[i]
count = 1
R[i] = count
现在找到 R 中的最大值,它将位于最长运行结束时的索引处:将此索引称为j。通过 A 向后工作以找到该运行的开始。伪代码:
i = j
val = A[j]
while A[i] == val do
--i
++i
++j
现在你寻找的切片从 A[i] 开始到 A[j-1] 结束。根据各种编程语言中通常的切片约定,最后一个索引应该正好在切片之外。然后 A[i..j] 或类似的语言可以在这种语言中正常工作。这是一个线性时间算法。
【讨论】: