题目:
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]。题目很好理解,而且因为看到了已经排好序,所以考虑用二分搜索,这是关键,找出具体的那个数的位置,然后找到后还得看这个数的位置,如果是在开头,那么只要从后面开始找,看看有没有了;如果是在结尾,那么向前找,如果是在中间,则采用夹逼,从两头开始夹,看是否有相同的,然后再返回。思路还是很简单的,主要是二分搜索法的应用,要回熟练地写,二分搜索法的关键是,一开始要判断start <= end,这是用递归做二分搜索的关键。
public int[] searchRange(int[] nums,int target)
{
int[] result = new int[2];
result[0] = -1;
result[1] = -1;
int length = nums.length;
if(nums == null || nums.length == 0)
{
result[0] = -1;
result[1] = -1;
return result;
}
if(nums.length == 1 && nums[0] == target)
{
result[0] = 0;
result[1] = 0;
return result;
}
else if(nums.length == 1 && nums[0] != target)
{
result[0] = -1;
result[1] = -1;
return result;
}
int num = binarySearch(nums,target,0,length - 1);
if(num == -1)
{
result[0] = -1;
result[1] = -1;
}
else
{
if(num == 0)
{
int i = 0;
for(i = 0; i < length; i++)
{
if(nums[i] != nums[num])
break;
}
result[0] = num;
result[1] = i - 1;
}
else if(num == length - 1)
{
int i = length - 1;
while(i >= 0)
{
if(nums[i] != nums[num])
break;
i--;
}
i++;
result[0] = i;
result[1] = num;
}
else
{
int i = num;
int j = num;
while(i <= length - 1)
{
if(nums[i] != nums[num])
break;
i++;
}
while(j >= 0)
{
if(nums[j] != nums[num])
break;
j--;
}
j++;
i--;
result[0] = j;
result[1] = i;
}
}
return result;
}
public int binarySearch(int[] nums,int target,int start,int end)
{
if(start <= end)
{
int mid = (start + end) / 2;
if(nums[mid] == target)
return mid;
if(nums[mid] < target)
return binarySearch(nums,target,mid + 1,end);
else if(nums[mid] > target)
return binarySearch(nums,target,start,mid - 1);
}
return -1;
}