在0和1的排序数组中找到1的位置的解决方案

时间:2013-09-16 07:02:20

标签: arrays algorithm

我接到亚马逊的电话,参加他们的一次面试,并给出了一个测试,为下面的问题编写最有效的解决方案。

在0和1的有序数组中找到1的最小位置。在数组0000001111中输出应该是6。

我在这上面尝试过binary_search,但这并没有利用数组只有0和1的属性。你能给我一些更好的解决方案。

由于 Niraj Rathi

2 个答案:

答案 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]] = 0arr[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
   }
}

这可能是你在寻找如果有任何想法比我真的有兴趣学习