您的位置:首页 > 编程语言 > Java开发

Search for a Range (Java)

2015-01-05 21:42 169 查看
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]
.

先用二分找到很多target值里的其中之一,随便是哪一个都可以,然后把这个值loc当做新的边界进行左右遍历来确定左右边界,遍历还是用二分查找,只是low和high的移动的判断条件改为是否==target即可。注意何时return low何时return high。(一般找不到的时候返回比该数小的数时返回high,比该数大时返回low,这道题,找第一个为target的应该是比前面的大的,找最后一个target应该是比后面小的)

Source

public class Solution {
public int[] searchRange(int[] A, int target) {
int[] a = {-1, -1};
if(A.length == 0) return a;
int low = 0, high = A.length - 1;
int loc = 0;

while(low <= high){
int mid = low + ((high - low) >> 1);
if(A[mid] > target)
high = mid - 1;
else if(A[mid] < target)
low = mid + 1;
else{
loc = mid;
break;
}
}
if(A[loc] != target) return a;  //***

low = 0;
high = loc;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(A[mid] == target)	//***
high = mid - 1;
else low = mid + 1;
}
a[0] = low;

low = loc;
high = A.length - 1;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(A[mid] == target)    //***
low = mid + 1;
else high = mid - 1;
}
a[1] = high;

return a;

}
}


Test

public static void main(String[] args){
int[] num = {1,2,3,4,5,5,5,5,6,7,8};
int[] b = new Solution().searchRange(num, 5);
System.out.println(b[0]);
System.out.println(b[1]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode