旋转阵列中的最长子阵列

Longest sub array in rotating array

有没有办法在 log(n) 时间内找到 1 的最长子数组?

示例:

  1. 110011111000 - 那么输出是 5(从 pos 5 到 10)

  2. 1110011101 - 这里的输出是 3 但在旋转 1 之后数组变为 111100111 并且输出现在是 4.

  3. 001111 - 这里的输出是从 pos 3 到 6 的 4 但旋转后它从 pos 4 到 6 变成 3

注意:我在旋转前找到O(n)中最长的子数组长度。如果我有过去的结果,如何改进旋转后的解决方案?

不行,因为你必须知道每一个字母的值才能算1s,至少是O(n)。

您可以按照以下步骤操作:

  1. 找到 1 的最长子数组(O(n))。在该循环中找到 0.
  2. 的第一个和最后一个实例
  3. 开始旋转并更新这些参数。
  4. 如果最后一个索引为 0,则搜索前一个 1 以保持更新参数(在复杂度上,这不会超过 O(n) 总计。

我假设您知道如何获取最大子数组索引并在 O(n) 中进行计数。除此之外,您还需要找到第二大子数组(可以在同一个循环中完成)。

让我们再提取 2 个参数 - 第一个和最后一个零(简单代码 - 如果你需要,我可以附加它)

旋转数组时有3个选项:

  1. 没有变化
  2. 创建了更大的子数组
  3. 当前最大的子数组中断

第一种和第二种情况——你只需要更新参数——O(1)——你可以根据你的参数知道是这种情况。在第三种情况下,您将需要使用找到的第二长子数组(注意一次只能打断 1 个子数组)

例如,假设您有数组:1110011101(作为您的示例)并且您有 max = 3maxIndex = 5。在 运行 之后 getZeroIndexs 函数你还知道 firstZeroIndex = 3lastZeroIndex = 8.

旋转后我们的变量会是什么样子?

max = 3
maxIndex = 6
firstZeroIndex = 4 // this will increase as long as the lastZeroIndex different then the array size
lastZeroIndex = 9 //this will go up till array.size - when it those you need to loop again till you find last

在这种情况下,第一个索引移动到 4 是什么使他比 max 大 -> max = 4maxIndex = 0

现在你的数组是:1111001110 所以 lastZeroIndex = 9 作为数组大小所以下一次旋转将产生:

max = 4
maxIndex = 1
firstZeroIndex = 0 
lastZeroIndex = ? // here you need to loop from the end of your array till you get 0 -> O(k) in total complexity, all the run together will be O(n)  

希望说清楚,如果不明白欢迎追问!