繁体   English   中英

算法-最小大于大小

[英]Algorithm - Minimum Greater Than Size

我对此有疑问:

我们有一个整数数组(大小为n) [x_1,x_2,...,x_n]

我们必须找到最长的公共部分[x_i,x_i+1,...,x_j] ,其中最小的(x_i,x_i+1,...,x_j) >= j-i+1 fe [2,2,1,4,3,3,1] -> 3 (最长的正确部分是4,3,3

我不知道如何将时间减少到O(n^2) (检查每个分段)我的第二个想法是:如果值x_k较小,则每个值x_k等于该部分可能具有的“长度范围”然后我们更改“长度范围”(同时计算此段的长度),但是我不知道如果我们得到更大的数字该怎么办

(非常感谢您的帮助-可能还有另一个更简单的解决方案,但我看不到)

卡特彼勒方法O(n),假设所有整数均为正:

  • 在第一个数字上放一个左右指针,您的最小值=这个数字。 长度= 1
  • 将右指针向前移动一个,检查条件(您很容易知道是否有一个新的最小值,并且知道长度+ = 1)
  • 如果您不能在不破坏条件的情况下向右移动指针,请向左移动指针并更新您的值
  • 如果您也不能使左指针前进,则找到满足条件的部分。 记下它的长度,并以相同的方式在下一个索引上开始一个新的部分。

适合您的示例:

[2,2,1,4,3,3,1]
[2] <- The first 2
[2,2] <- Moved the right
[2] <- Moved the left, both R and L are pointing at the second 2
<-Can't move either, note max length and indices from previous run.
[1] <- Starting again
<-Can't move either
[4] <- Starting again
[4,3] <- Right
[4,3,3] <- Right (New max length and indices noted)
[3,3] <- Left. Doesn't improve the max
[3] <- Left again.
<- Can't move either, note max and indices, in this case overwrite length
[1] <-Start again
<- end of loop, check global max length, output

这是O(n),因为每个指针(L和R)仅在任何给定索引上移动一次。

我认为这足以让您以您选择的任何语言编写算法。 请注意循环结束条件,因为如果阵列用完了,则必须检查全局最大长度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM