【问题标题】:searching a element in a array which is rotated N times搜索旋转 N 次的数组中的元素
【发布时间】:2011-05-10 06:39:33
【问题描述】:

我有一个旋转 n 次的排序数组,n 是未知的。现在我想在 O(nlog n) 中使用二进制搜索来搜索一个元素。我实现了以下代码,它工作正常。 但我认为条件 if((end-start)==1 ) 可以通过进行一些修改来跳过, 有人可以建议吗?

Eg of array 1 2 3 4 5 
            2 3 4 5 1 //rotated once

代码:

public static int srch(int a[],int start,int end,int key){
    if(start>end)
        return -1;

    if((end-start)==1 ){
        if(key==a[start])
            return start;
        else if(key==a[end])
            return end;
        else
            return -1;
    }
    int mid = (start+end)/2;

    if(a[mid]== key){
        return mid;
    }
    else{
        if(a[start] < a[mid] ){
            //first half is sorted
            if(key>a[mid]|| key <a[start]){
                start= mid+1;
            }else{
                end =mid-1;
            }
        }else{
            //second half is sorted

            if(key>a[mid]){
                start= mid+1;
            }else{
                end =mid-1;
            }
        }
        return srch(a, start, end, key);
    }
}

有更好/更简单/更有效的解决方案吗?

【问题讨论】:

标签: algorithm


【解决方案1】:

对于数组 {4,5,1,2,3} 和 key=4,您的解决方案失败。 我认为第二部分的修改将解决问题

else{
            //second half is sorted

            if(key>a[mid] && key<=a[end]){// modified condition
                start= mid+1;
            }else{
                end =mid-1;
            }

但我认为条件 if((end-start)==1 ) 可以被跳过 做一些修改,任何人都可以 建议?

我想这个条件根本不需要。 你能推荐一个你修改过的代码失败的测试用例吗?

public static int srch(int a[],int start,int end,int key){
    if(start>end)
        return -1;

     int mid = (start+end)/2;

    if(a[mid]== key){
        return mid;
    }
    else{
        if(a[start] < a[mid] ){
            //first half is sorted
            if(key>a[mid]|| key <a[start]){
                start= mid+1;
            }else{
                end =mid-1;
            }
        }else{
            //second half is sorted

            if(key>a[mid] && key<=a[high]){
                start= mid+1;
            }else{
                end =mid-1;
            }
        }
        return srch(a, start, end, key);
    }
}

【讨论】:

    【解决方案2】:

    您的解决方案在 O(log n) 中运行,因此没有更有效的解决方案。也许您的部分代码可以优化,但这不会影响 O 的运行时间。正如您所说,代码可以工作并返回正确的值,因此我会说这是您面试问题的正确答案。

    【讨论】:

      【解决方案3】:

      我没有彻底检查你的代码是否正确,但你的解决方案是 O(log n)。在算法上你不可能有更好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-03
        • 2018-01-13
        • 2014-10-08
        • 2017-05-21
        • 2019-08-19
        • 2021-09-18
        • 1970-01-01
        • 2010-12-31
        相关资源
        最近更新 更多