旋转阵列中最长的子阵列

时间:2018-11-11 10:09:11

标签: arrays algorithm rotation subsequence

有什么方法可以找到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)中的子数组长度最长。如果我有过去的结果,如何在轮换后改善解决方案?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

旋转数组时,有3个选项:

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

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

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

旋转后我们的var的外观如何?

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)  

希望清楚,如果不能随意询问!

答案 1 :(得分:0)

不,因为您必须知道每个字母的值都必须为1s,至少为O(n)。