有什么方法可以找到log(n)时间中最长的1的子数组吗?
示例:
110011111000
-输出为5(从pos 5到10)
1110011101
-此处的输出为3,但旋转1后,数组变为111100111
,输出为4。
001111
-此处的输出从pos 3到6为4,但旋转后从pos 4到6变为3
注意:在旋转之前,我发现O(n)中的子数组长度最长。如果我有过去的结果,如何在轮换后改善解决方案?
答案 0 :(得分:1)
您可以按照以下步骤操作:
我假设您知道如何获取最大子数组索引并在O(n)中进行计数。除此之外,您将需要找到第二大子数组(可以在同一循环中完成)。
再提取2个参数-第一个和最后一个零(简单代码-如果需要,我可以附加它)
旋转数组时,有3个选项:
在第一种和第二种情况下-您只需要更新参数-O(1)-您可以根据您的参数知道这种情况。在第三个数组中,您将需要使用找到的第二个最长子数组(注意一次只能中断1个子数组)
例如,假设您有一个数组:1110011101
(作为示例),并且您有max = 3
和maxIndex = 5
。运行getZeroIndexs
函数后,您还知道firstZeroIndex = 3
和lastZeroIndex = 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 = 4
和maxIndex = 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)。