当前位置:首页 > 未命名 > 正文内容

【解题报告】【lintcode61】 Search for a Range

u3blog9年前 (2016-05-17)未命名382

题意

在一个有序数组中,找到给出的范围值的开始和结束点下标 nlogn的复杂度

解答

看到nlogn和有序数组,那么就能想象到二分查找,但是需要对二分查找做一些改动 当找到目标时不停止,而是继续对左右区间进行二分,并维护找到区间边缘的最小/最大下标 那么,一次二分进行完毕之后,我们就可以得到最大最小的范围了。

代码

public class Solution {
    /** 
     *@param A : an integer sorted array
     *@param target :  an integer to be inserted
     *return : a list of length 2, [index1, index2]
     */
    int max,min;
    boolean flag;
    public int[] searchRange(int[] A, int target) {
        // write your code here
        max = 0;
        min = A.length;
        flag = false;
        search(A,0,A.length - 1,target);
        if (flag)
        return new int[]{min,max};
        else
            return new int[]{-1,-1};
    }
    private void search(int[] A,int l,int r,int target){
        if (l < 0||r >= A.length||l > r)
            return;
        int mid;
        while (l <= r)
        {
            mid = (l + r)/2;
            if (A[mid] > target)
                r = mid -1;
            if (A[mid] < target)
                l = mid +1;
            if (A[mid] == target)
            {
                if (mid > max)
                    max = mid;
                if (mid < min)
                    min = mid;
                flag = true;
               search(A,l,mid-1,target);
               search(A,mid+1,r,target);
                return;
            }
        }

    }
}

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=412

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。