有没有办法找到在对数(n)时间内1的最长子阵?
例子:
110011111000-然后输出为5(从位置5到10)
1110011101-这里的输出是3,但是在旋转1之后,数组变为111100111,现在的输出是4。
001111-这里的输出从3号位置到6号位置是4,但旋转后从4号位置到6号位置变成3
注:我发现了在旋转之前o(n)中最长的子阵长度。如果我有过去的结果,如何改进旋转后的解决方案?

最佳答案

您可以遵循以下步骤:
找到1(in o(n))的最长子阵。在该循环中,查找0的第一个和最后一个实例。
开始旋转并更新这些参数。
如果最后一个索引是0,搜索前1个,以保持更新的参数(在复杂性上,这不会超过O(n)总数。
我假设你知道如何得到最大子阵索引并在O(n)中计数除此之外,您还需要找到第二大子阵列(可以在同一个循环中完成)。
让我们再提取2个参数-第一个和最后一个零(简单的代码-如果需要我可以附加它)
旋转阵列时有3个选项:
没什么变化
创建更大的子阵列
当前最大子阵破裂
在第一和第二种情况下-你只需要更新params-o(1)-你可以知道这是根据你的params的情况。在第三种情况下,您需要使用找到的第二长子阵列(请注意,一次只能断开一个子阵列)
例如,假设您有数组: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)

希望它清楚,如果不想问!

关于arrays - 旋转阵列中最长的子阵列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53247660/

10-16 23:21