【问题标题】:Algorithm - Minimum Greater Than Size算法 - 最小大于大小
【发布时间】:2016-02-13 03:50:23
【问题描述】:

我对此有疑问:

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

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

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

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

【问题讨论】:

  • 你的意思是最长的连续切片,其中最小值高于数组其余部分的值吗?
  • 您也可以要求一个切片,其最小值大于切片的长度

标签: arrays algorithm time


【解决方案1】:

Caterpillar 方法,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)只在任何给定索引上移动一次。

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

【讨论】:

  • 谢谢 :) 没想到这么简单
  • 很高兴你喜欢它。如果您在实施方面需要任何帮助,请告诉我。也让我知道它是否会被接受。
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2023-01-03
  • 2020-04-27
相关资源
最近更新 更多