您的位置:首页 > 其它

leetcode:Search for a Range 二分查找

2014-09-21 11:40 441 查看

Search for a Range

Given a sorted array of integers, find the starting and ending position of a given target value.Your algorithm's runtime complexity must be in the order of O(log n).If the target is not found in the array, return
[-1, -1]
.For example,Given
[5, 7, 7, 8, 8, 10]
and target value 8,return
[3, 4]
.题目描述的意思是,从一个有序数组里找到给定目标数的起始下标和结束下标,如果没找到就返回[-1,-1],时间复杂度要为O(logn)。因为有时间复杂度的限制,直接遍历肯定是不行的,遍历的复杂度为O(n);很容易想到,可以使用二分查找稍微变化一下,找到目标数后就把数组分成两半继续查找,每次找到后替换开始下标或结束下标就行。
/**
* Created by shily on 2014/9/21.
*/
public class SearchforaRange {
public static void main(String[] args){
int[] a = {8,8,8,8,8,8,8};
int[] b = searchRange(a,8);
System.out.print(b[0]+" "+b[1]);
}
public static int[] searchRange(int[] A, int target) {
int index = binarySearch(A,0,A.length-1,target);
int[] targetIndexs = {-1,-1};
if(index!=-1){
int left  = index;
int right = index;
targetIndexs[0] = left;
targetIndexs[1] = right;
while ((left = binarySearch(A,0,left-1,target))!=-1) targetIndexs[0] = left;
while ((right = binarySearch(A,right+1,A.length-1,target))!=-1) targetIndexs[1] = right;
}
return targetIndexs;
}

private static int binarySearch(int[] A,int low,int high,int target){
while(low<=high){
int mid = low + (high-low)/2;
if      (A[mid]>target) high = mid - 1;
else if (A[mid]<target) low  = mid + 1;
else    return mid;
}
return -1;
}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: