您的位置:首页 > 其它

leetcode:Search for a Range

2014-06-16 00:29 423 查看
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,输出他在数组中的起始和终结下标;

如果没有,输出-1;

其实就是二分查找,但是要注意二分查找的边界设置,一个是要查到最左边的位置,一个是要查找到最右边的

位置

public class Solution {
public int[] searchRange(int[] A, int target) {
int find = findOne(A,target, 0,A.length - 1);
int ans[] = new int[2];
int low = 0;
int hight = A.length - 1;
if(find == -1){
low = -1;
hight = -1;
}
else{
low = find; hight = find;
int temp = findLeft(A,target, 0, find - 1);
if(temp != -1) low = temp;
temp = findRight(A, target, find + 1, A.length - 1);
if(temp != -1) hight = temp;
}
ans[0]= low;
ans[1] = hight;
return ans;
}

public int findOne(int[] arr, int target,int low,int hight){
while(low <= hight){
int mid = (low + hight) /2 ;
if(arr[mid] == target){
return mid;
}
else if(arr[mid] < target){
low = mid + 1;
}
else {
hight = mid - 1;
}
}
return -1;
}
public int findLeft(int arr[], int target, int low , int hight){
int find = findOne(arr,target, low, hight);
int temp = find;
while(temp != -1){
find = temp;
temp = findOne(arr,target,low, find - 1);
}
return find;
}
public int findRight(int arr[], int target, int low , int hight){
int find = findOne(arr,target, low, hight);
int temp = find;
while(temp != -1){
find = temp;
temp = findOne(arr,target,find + 1, hight);
}
return find;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: