我接到亚马逊的电话,参加他们的一次面试,并给出了一个测试,为下面的问题编写最有效的解决方案。
在0和1的有序数组中找到1的最小位置。在数组0000001111中输出应该是6。
我在这上面尝试过binary_search,但这并没有利用数组只有0和1的属性。你能给我一些更好的解决方案。
由于 Niraj Rathi
答案 0 :(得分:5)
您可以使用值为0和1的事实来以更紧凑的方式编写标准二进制搜索:
int firstOne(int[] arr) {
int[] a = new int[2];
a[0] = 0;
a[1] = arr.length;
while (a[1] - a[0] > 1) {
int m = (a[1] + a[0]) / 2;
a[arr[m]] = m;
}
return a[1];
}
由于使用了数组a
,我们拥有arr[a[0]] = 0
和arr[a[1]] = 1
的不变量。如果循环结束,a[0]
和a[1]
指向两个连续的数组元素,因此a[1]
是第一个1.注意我忽略了特殊情况(全0,全1或空输入)。
答案 1 :(得分:2)
和二进制一样尝试这个..
while
{
if array[array.length/2] == 1
{
if array[array.length/2 - 1 ] == 0
return
array = 1st half of array
}
else
{
if array[array.length/2 + 1 ] == 0
return
array = 2nd half of array
}
}
这可能是你在寻找如果有任何想法比我真的有兴趣学习